1.Numpy是什么?
NumPy
(Numerical Python的縮寫(xiě))是一個(gè)開(kāi)源的Python
科學(xué)計(jì)算庫(kù)。使用NumPy
,就可以很自然地使用數(shù)組和矩陣。 NumPy
包含很多實(shí)用的數(shù)學(xué)函數(shù),涵蓋線(xiàn)性代數(shù)運(yùn)算、傅里葉變換和隨機(jī)數(shù)生成等功能。
這個(gè)庫(kù)的前身是1995年就開(kāi)始開(kāi)發(fā)的一個(gè)用于數(shù)組運(yùn)算的庫(kù)。經(jīng)過(guò)了長(zhǎng)時(shí)間的發(fā)展,基本上成了絕大部分Python
科學(xué)計(jì)算的基礎(chǔ)包,當(dāng)然也包括所有提供Python
接口的深度學(xué)習(xí)框架。
2.為什么使用Numpy?
a)便捷:
對(duì)于同樣的數(shù)值計(jì)算任務(wù),使用NumPy
要比直接編寫(xiě)Python
代碼便捷得多。這是因?yàn)?code>NumPy能夠直接對(duì)數(shù)組和矩陣進(jìn)行操作,可以省略很多循環(huán)語(yǔ)句,其眾多的數(shù)學(xué)函數(shù)也會(huì)讓編寫(xiě)代碼的工作輕松許多。
b)性能:
NumPy
中數(shù)組的存儲(chǔ)效率和輸入輸出性能均遠(yuǎn)遠(yuǎn)優(yōu)于Python
中等價(jià)的基本數(shù)據(jù)結(jié)構(gòu)(如嵌套的list容器)。其能夠提升的性能是與數(shù)組中元素的數(shù)目成比例的。對(duì)于大型數(shù)組的運(yùn)算,使用NumPy
的確很有優(yōu)勢(shì)。對(duì)于TB
級(jí)的大文件,NumPy
使用內(nèi)存映射文件來(lái)處理,以達(dá)到最優(yōu)的數(shù)據(jù)讀寫(xiě)性能。
c)高效:
NumPy
的大部分代碼都是用C語(yǔ)言
寫(xiě)成的,這使得NumPy
比純Python
代碼高效得多。
當(dāng)然,NumPy
也有其不足之處,由于NumPy
使用內(nèi)存映射文件以達(dá)到最優(yōu)的數(shù)據(jù)讀寫(xiě)性能,而內(nèi)存的大小限制了其對(duì)TB級(jí)大文件的處理;此外,NumPy
數(shù)組的通用性不及Python
提供的list
容器。因此,在科學(xué)計(jì)算之外的領(lǐng)域,NumPy
的優(yōu)勢(shì)也就不那么明顯。
(推薦教程:python教程)
3.Numpy的安裝:
- 官網(wǎng)安裝:http://www.numpy.org/。
- pip 安裝:pip install numpy。
- LFD安裝:針對(duì)windows用戶(hù)http://www.lfd.uci.edu/~gohlke/pythonlibs/。
- Anaconda安裝(推薦):Anaconda里面集成了很多關(guān)于python科學(xué)計(jì)算的第三方庫(kù),主要是安裝方便。下載地址:https://www.anaconda.com/download/。
4.numpy 基礎(chǔ):
NumPy
的主要對(duì)象是同種元素的多維數(shù)組。這是一個(gè)所有的元素都是一種類(lèi)型。在NumPy
中維度(dimensions)叫做軸(axes),軸的個(gè)數(shù)叫做秩(rank)。NumPy
的數(shù)組類(lèi)被稱(chēng)作 ndarray
(矩陣也叫數(shù)組 。通常被稱(chēng)作數(shù)組。
常用的ndarray
對(duì)象屬性有:
ndarray.ndim
(數(shù)組軸的個(gè)數(shù),軸的個(gè)數(shù)被稱(chēng)作秩),ndarray.shape
(數(shù)組的維度。這是一個(gè)指示數(shù)組在每個(gè)維度上大小的整數(shù)元組。例如一個(gè)n行m列的矩陣,它的shape
屬性將是(2,3),這個(gè)元組的長(zhǎng)度顯然是秩,即維度或者ndim
屬性),ndarray.size
(數(shù)組元素的總個(gè)數(shù),等于shape
屬性中元組元素的乘積),ndarray.dtype
(一個(gè)用來(lái)描述數(shù)組中元素類(lèi)型的對(duì)象,可以通過(guò)創(chuàng)造或指定dtype
使用標(biāo)準(zhǔn)Python
類(lèi)型。另外NumPy
提供它自己的數(shù)據(jù)類(lèi)型)。
Numpy的數(shù)據(jù)類(lèi)型:
import numpy as np
a = np.dtype(np.int_) # np.int64, np.float32 …
print(a)
Numpy內(nèi)置的特征碼:
int8, int16, int32,int64 可以由字符串’i1’, ‘i2’,’i4’, ‘i8’代替,其余的以此類(lèi)推。
import numpy as np
a = np.dtype(‘i8’) # ’f8’, ‘i4’’c16’,’a30’(30個(gè)字符的字
# 符串), ‘>i4’…
print (a)
可以指明數(shù)據(jù)類(lèi)型在內(nèi)存中的字節(jié)序,’>’表示按大端的方式存儲(chǔ),’<’表示按小端的方式存儲(chǔ),’=’表示數(shù)據(jù)按硬件默認(rèn)方式存儲(chǔ)。大端或小端存儲(chǔ)只影響數(shù)據(jù)在底層內(nèi)存中存儲(chǔ)時(shí)字節(jié)的存儲(chǔ)順序,在我們實(shí)際使用python
進(jìn)行科學(xué)計(jì)算時(shí),一般不需要考慮該存儲(chǔ)順序。
(推薦微課:python3基礎(chǔ)微課)
5.創(chuàng)建數(shù)組并查看其屬性:
(1) 用np.array從python列表和元組創(chuàng)建數(shù)組:
import numpy as np
a = np.array([[1,2,3], [4, 5, 6]], dtype=int)
print(a.shape) # a.ndim, a.size, a.dtype
import numpy as np
a = np.array([(1,2,3), (4, 5, 6)], dtype=float)
print(a.shape) # a.ndim, a.size, a.dtype
(2) 用np.arange().reshape()創(chuàng)建數(shù)組:
import numpy as np
a = np.arange(10).reshape(2, 5) # 創(chuàng)建2行5列的二維數(shù)組,
# 也可以創(chuàng)建三維數(shù)組,
# a = np.arange(12).reshape(2,3,2)
print(a)
判斷下列三維數(shù)組的shape
:
a = np.array([[[1,2,3], [4, 5, 6], [7, 8, 9]]])
b = np.array([[[1,2,3]], [[4, 5, 6]], [[7, 8, 9]]])
6.基本運(yùn)算:
import numpy as np
a = np.random.random(6)
b = np.random.rand(6)
c = np.random.randn(6)
print(a-b) # print(a+b),print(a*c) …
# 二維數(shù)組運(yùn)算
d = np.random.random((2,3))
e = np.random.randn(2, 3)
f = np.random.rand(2,3)
print(d-e) # print(d+f),print(e*f) …
print(np.dot(a,b)) #復(fù)習(xí)矩陣乘法
print(a.dot(b))
# Numpy 隨機(jī)數(shù)模塊np.random.random, np.random.randn, np.random.rand的比較
(1)rand 生成均勻分布的偽隨機(jī)數(shù)。分布在(0~1)之間
(2)randn 生成標(biāo)準(zhǔn)正態(tài)分布的偽隨機(jī)數(shù)(均值為0,方差為1)。
import numpy as np
a = np.ones((2,3))
b = np.zeros((2,3))
a*=3
b+=a
7.常用函數(shù):
import numpy as np
a = np.arange(10)
np.where()
8.索引,切片和迭代:
import numpy as np
a = arange(10)**3
a[2]
a[2:5]
a[:6:2] = -1000
a[ : :-1]
for i in a:
print i**(1/3.)
# 多維數(shù)組的索引
b = np.arange(20).reshape(5,4)
b[2,3]
b[0:5, 1]
b[ : ,1]
b[1:3, : ]
#當(dāng)少于軸數(shù)的索引被提供時(shí),確失的索引被認(rèn)為是整個(gè)切片
b[-1] #相當(dāng)于b[-1,:]
# b[i] 中括號(hào)中的表達(dá)式被當(dāng)作 i 和一系列 : ,來(lái)代表剩下的軸。NumPy也允許你使用“點(diǎn)”像 b[i,...] 。
#點(diǎn) (…)代表許多產(chǎn)生一個(gè)完整的索引元組必要的分號(hào)。如果x是
#秩為5的數(shù)組(即它有5個(gè)軸),那么:x[1,2,…] 等同于 x[1,2,:,:,:],x[…,3] 等同于 x[:,:,:,:,3],x[4,…,5,:] 等同 x[4,:,:,5,:].
三維數(shù)組的索引:
c = np.arange(12).reshape(2,3,2)
c[1]
c[2,1] # 等價(jià)于c[2][1]
c[2,1,1] # 等價(jià)于c[2][1][1]
# 通過(guò)數(shù)組索引
d = np.arange(10)**2
e = np.array ([3, 5, 6])
d[e] = ?
#練習(xí), 用同樣的方法在二維數(shù)組中操作。
# 通過(guò)布爾數(shù)組索引
f = np.arange(12).reshape(3, 4)
g = f>4
print(g)
f [g]
迭代多維數(shù)組是就第一個(gè)軸而言的:
h = np.arange(12).reshape(3,4)
for i in h:
print(i)
如果想對(duì)每個(gè)數(shù)組中元素進(jìn)行運(yùn)算,我們可以使用flat屬性,該屬性是數(shù)組元素的一個(gè)迭代器:
for i in h.flat:
print(i)
補(bǔ)充:flatten()
的用法:
np.flatten()
返回一個(gè)折疊成一維的數(shù)組。但是該函數(shù)只能適用于numpy
對(duì)象,即array
或者mat
,普通的list
列表是不行的。
import numpy as np
a = np.array([[1,2], [3, 4], [5, 6]])
a.flatten()
b = np.mat([[1,2,3], [4, 5, 6]])
b.flatten()
c = [[1,2,3], [4, 5, 6]]
c.flatten() ?
想要list
達(dá)到同樣的效果可以使用列表表達(dá)式:
[y for x in a for y in x]
9. 形狀操作:
ravel()
,vstack()
,hstack()
,column_stack
,row_stack
, stack
, split
, hsplit
, vsplit
import numpy as np
#增加維度
a = np.arange(5)
a[:, np.newaxis]
a[np.newaxis, :]
np.tile([1,2], 2)
#合并
a = np.arange(10).reshape(2,5)
print(a.ravel())
print(a.resize(5,2))
b = np.arange(6).reshape(2,3)
c = np.ones((2,3))
d = np.hstack((b,c)) # hstack:horizontal stack 左右合并
e = np.vstack((b,c)) # vstack: vertical stack 上下合并
f = np.column_stack((b,c))
g = np.row_stack((b,c))
h = np.stack((b, c), axis=1) # 按行合并
i = np.stack((b,c), axis=0) # 按列合并
j = np.concatenate ((b, c, c, b), axis=0) #多個(gè)合并
#分割
k = np.hsplit(i, 2)
l = np.vsplit(i, 2)
m = np.split(i, 2, axis=0)
n = np.split(i, 2,axis=1)
o = np.array_split(np.arange(10),3) #不等量分割
10.深拷貝:
import numpy as np
a = np.arange (4)
b = a
c = a
d = b
a[0]=10 a = ? b = ? c= ? d = ?
b = a.copy()
a [0] = 9
b = ?
11.廣播 Broadcasting
廣播是一種強(qiáng)有力的機(jī)制,它讓Numpy
可以讓不同大小的矩陣在一起進(jìn)行數(shù)學(xué)計(jì)算。我們常常會(huì)有一個(gè)小的矩陣和一個(gè)大的矩陣,然后我們會(huì)需要用小的矩陣對(duì)大的矩陣做一些計(jì)算。
把一個(gè)向量加到矩陣的每一行:
import numpy as np
a = np.array ([[1,2,3], [4,5,6], [7,8,9]])
b = np.array ([10,10,10])
c = np.tile(b, (4,1))
d = a + c
#用廣播機(jī)制:
c = a + b
對(duì)兩個(gè)數(shù)組使用廣播機(jī)制要遵守下列規(guī)則:
- 如果數(shù)組的秩不同,使用1來(lái)將秩較小的數(shù)組進(jìn)行擴(kuò)展,直到兩個(gè)數(shù)組的尺寸的長(zhǎng)度都一樣。
- 如果兩個(gè)數(shù)組在某個(gè)維度上的長(zhǎng)度是一樣的,或者其中一個(gè)數(shù)組在該維度上長(zhǎng)度為1,那么我們就說(shuō)這兩個(gè)數(shù)組在該維度上是相容的。
- 如果兩個(gè)數(shù)組在所有維度上都是相容的,他們就能使用廣播。
- 如果兩個(gè)輸入數(shù)組的尺寸不同,那么注意其中較大的那個(gè)尺寸。因?yàn)閺V播之后,兩個(gè)數(shù)組的尺寸將和那個(gè)較大的尺寸一樣。
- 在任何一個(gè)維度上,如果一個(gè)數(shù)組的長(zhǎng)度為1,另一個(gè)數(shù)組長(zhǎng)度大于1,那么在該維度上,就好像是對(duì)第一個(gè)數(shù)組進(jìn)行了復(fù)制。
以上就是關(guān)于python
中numpy
庫(kù)的相關(guān)知識(shí)了,希望對(duì)大家有所幫助。