2019-08-2610:28:52
numpy中文教程地址:https://yiyibooks.cn/xx/NumPy_v111/user/index.html
1. np.empty(shape,dtype=float,order="C")
函數說明:用來創建一個指定形狀和數據類型且未初始化的數組,變量中的元素是隨機生成的,實際為空。
實例:
>>> import numpy as np
>>> np.empty([2,3],dtype=float)
array([[0., 0., 0.],
[0., 0., 0.]])
2.numpy.zeros(shape, dtype = float, order = 'C')
函數說明:用來創建指定大小的元素為0的數組
實例:
>>> np.zeros(shape=(2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
3.numpy.ones(shape, dtype = None, order = 'C')
函數說明:用來創建指定大小的元素為1的數組
實例:
>>> np.ones(shape=(2,3))
array([[1., 1., 1.],
[1., 1., 1.]])
4.np.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0)
函數說明:根據目標元素創建數組,目標元素可以為列表,元素,等。
實例:
>>> np.array([[1,23],[2,3]])
array([[ 1, 23],
[ 2, 3]])
5.np.full(shape,fill_value,dtype=None,order='C')
函數說明:生成指定shape大小的數組,此數組用指定的值填充。
實例:
>>> np.full((2,3),7)
array([[7, 7, 7],
[7, 7, 7]])
6.np.ones_like(a,dtype=None,order='K',subok=True,shape=None);np.zeros_like(),np.empty_like()
函數說明:生成與目標數組a相同shape大小的數組。np.zeros_like()和np.empty_like()與np.ones_like()函數類似。
實例:
>>> import numpy as np
>>> a=np.array([[[1,2],[2,3]],[[3,4],[1,2]],[[3,2],[2,1]]])
>>> a
array([[[1, 2],
[2, 3]],
[[3, 4],
[1, 2]],
[[3, 2],
[2, 1]]])
>>> a.shape
(3, 2, 2)
>>> b=np.ones_like(a)
>>> b
array([[[1, 1],
[1, 1]],
[[1, 1],
[1, 1]],
[[1, 1],
[1, 1]]])
>>> b.shape
(3, 2, 2)
>>> c=np.zeros_like(a)
>>> c
array([[[0, 0],
[0, 0]],
[[0, 0],
[0, 0]],
[[0, 0],
[0, 0]]])
>>> c.shape
(3, 2, 2)
>>> d=np.empty_like(a)
>>> d
array([[[0, 0],
[0, 0]],
[[0, 0],
[0, 0]],
[[0, 0],
[0, 0]]])
>>> d.shape
(3, 2, 2)
7.np.reshape(a,newshape,order='C')
函數說明:生成與目標數據a具有相同類型不同shape的數組。新數組與原來數組的元素數量要相同。newshape可以且只能保留一個維度的值為-1,reshape函數可以自動計算。
個人理解:計算過程為把原來的數組從最高維度(最右側維度),把所有元素串起來形成一維數據后,按照新的reshape從最高緯度到最低維度依次填充數據。
實例:
>>> import numpy as np
>>> a= np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],[13, 14, 15, 16]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
>>> a.reshape(-1)
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
>>> a.reshape(-1,2)
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10],
[11, 12],
[13, 14],
[15, 16]])
8.屬性獲得:np.ndim,np.shape,np.size,np.dtype,np.real,np.imag
函數說明:獲得numpy數組的數據屬性值(不能加括號),數組的所有數據具有相同的數據類型(float,int等),不過不是,numpy會自動進行轉化。
np.ndim為數組的秩,也即軸或者維度的數量,例如一維為1,二維為2,三維空間為3。
np.shape為數據的詳細維度,返回的是一個元組,例如一維為(n, ),二維為(m,n),三維為(m,n,k)。
np.size為數組元素的總個數,例如,一維為n,二維為m*n,三維為m*n*k。
np.dtype為數組的元素數據類型,例如int8,int16,int32,int64,uint8,uint16,float16,float32等等。
np.real為元素的實部
np.imag為元素的虛部
實例:
>>> a=np.array([1,2,3])
>>> b=np.array([[1,2],[3,4],[5,3]])
>>> c=np.array([[[2,3,4],[2,3,1]],[[2,3,1],[5,6,7]]])
>>> a
array([1, 2, 3])
>>> b
array([[1, 2],
[3, 4],
[5, 3]])
>>> c
array([[[2, 3, 4],
[2, 3, 1]],
[[2, 3, 1],
[5, 6, 7]]])
>>> a.ndim
1
>>> b.ndim
2
>>> c.ndim
3
>>> a.shape
(3,)
>>> b.shape
(3, 2)
>>> c.shape
(2, 2, 3)
>>> a.size
3
>>> b.size
6
>>> c.size
12
>>> a.dtype
dtype('int64')
>>> b.dtype
dtype('int64')
>>> c.dtype
dtype('int64')
9.np.linspace(start,stop,num=50,endpoint=True,retstep=False,dytpe=None,axis=0)
函數說明:生成從開始到終止指定間隔內均勻間隔的數字序列。
個人理解:當知道間隔內的樣本數時采用
實例:
>>> np.linspace(2.0,3.0,num=5)
array([2. , 2.25, 2.5 , 2.75, 3. ])
>>> np.linspace(2.0,3.0,num=5,endpoint=False)
array([2. , 2.2, 2.4, 2.6, 2.8])
>>> np.linspace(2.0,3.0,num=5,retstep=True)
(array([2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
10.np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)
函數說明:生成固定間隔內的指定數目的等比數列,默認是意10為底的。
實例:
>>> np.logspace(1.0,2.0,num=10)
array([ 10. , 12.91549665, 16.68100537, 21.5443469 ,27.82559402, 35.93813664, 46.41588834, 59.94842503,77.42636827, 100. ])
11.np.arange(start,stop,step,dtype=None)
函數說明:生成指定間隔內固定間隔的數據。如果不指定step,默認為1;如果不指定start,默認為0。
個人理解:與np.linspace的區別是,當知道間隔內的固定間隔時采用。
實例:
>>> np.arange(4)
array([0, 1, 2, 3])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,10,2)
array([3, 5, 7, 9])
12.數學運算:+,-,*,/,**
函數說明:基本的數學運算,是數組之間對應元素之間的數學運算,特殊的**符號表示次方,例如3**2=27
個人理解:兩個數組之間如果shape相同可直接計算,不相同時至少保證其中一個維度相同(此時使用numpy的廣播性質進行擴展計算)
實例:
>>> b=np.ones(shape=(2,3))
>>> b
array([[1., 1., 1.],
[1., 1., 1.]])
>>> k=np.array([[2,3,4],[22,33,12]])
>>> k
array([[ 2, 3, 4],
[22, 33, 12]])
>>> b+k
array([[ 3., 4., 5.],
[23., 34., 13.]])
>>> b-k
array([[ -1., -2., -3.],
[-21., -32., -11.]])
>>> b*k
array([[ 2., 3., 4.],
[22., 33., 12.]])
>>> b/k
array([[0.5 , 0.33333333, 0.25 ],
[0.04545455, 0.03030303, 0.08333333]])
>>> b**2
array([[1., 1., 1.],
[1., 1., 1.]])
>>> k**2
array([[ 4, 9, 16],
[ 484, 1089, 144]])
>>> a=np.ones(3)
>>> a
array([1., 1., 1.])
>>> c=np.array([1,2,3])
>>> a*c
array([1., 2., 3.])
>>> b*c
array([[1., 2., 3.],
[1., 2., 3.]])
13.A.dot(B),A.T
函數說明:dot表示矩陣乘法,要求第一元素的列數等於第二個元素的行數,.T表示矩陣的轉置。
實例:
>>> import numpy as np
>>> A=np.array([[1,1],[2,3]])
>>> B=np.array([[1,2,3],[1,1,1]])
>>> A
array([[1, 1],
[2, 3]])
>>> B
array([[1, 2, 3],
[1, 1, 1]])
>>> A.dot(B)
array([[2, 3, 4],
[5, 7, 9]])
>>> A.T
array([[1, 2],
[1, 3]])
14.np.sum(a,axis=None,dtype=None,out=None,keepdim=<no value>,initial=<no value>,where=<no value>)
函數說明:求目標數組a,指定維度的和,如果沒有指定為所有維度的元素。
參數說明:a是要進行加法運算的數組元素。axis可取1.None(默認):對所有元素求和,2.整數:對指定維度求和(壓縮指定維度),3,整數元組
實例:
>>> A
array([[1, 1],
[2, 3]])
>>> np.sum(A)
7
>>> np.sum(A,axis=0)
array([3, 4]) #說明:0維度消失,3=1+2,4=1+3
>>> B=np.ones((2,3,4),dtype=int)
>>> B
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
>>> np.sum(B,axis=(0,1))
array([6, 6, 6, 6])
15. np.min(a,axis=None,dtype=None,out=None,keepdim=<no value>,initial=<no value>,where=<no value>)
函數說明:求目標數組a指定維度的最小值,如果沒有指定為所有維度的元素。
參數說明:與np.sum函數相同。
實例:
>>> a=np.arange(8).reshape(2,4)
>>> a
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> np.min(a)
0
>>> np.min(a,axis=0)
array([0, 1, 2, 3])
16.np.max(a,axis=None,dtype=None,out=None,keepdim=<no value>,initial=<no value>,where=<no value>)
函數說明:求目標數組a指定維度的最大值,如果沒有指定為所有維度的元素。
函數說明:與np.sum函數相同。
實例:
>>> a
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> a.max()
7
>>> a.max(axis=1)
array([3, 7])
17.np.exp(x,/,out=None)
函數說明:對目標數組x的所有元素計算以e為底的指數數值。
實例:
>>> a=np.arange(6)
>>> b=a.reshape(2,3)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> b
array([[0, 1, 2],
[3, 4, 5]])
>>> np.exp(a)
array([ 1. , 2.71828183, 7.3890561 , 20.08553692, 54.59815003, 148.4131591 ])
>>> np.exp(b)
array([[ 1. , 2.71828183, 7.3890561 ],[ 20.08553692, 54.59815003, 148.4131591 ]])
18.np.sqrt(x,/,out=None)
函數說明:對目標數組x的所有元素求0.5次方(開方)
實例:
>>> a=np.array([0,1,4,9])
>>> b=a.reshape(2,2)
>>> a
array([0, 1, 4, 9])
>>> b
array([[0, 1],
[4, 9]])
>>> np.sqrt(a)
array([0., 1., 2., 3.])
>>> np.sqrt(b)
array([[0., 1.],
[2., 3.]])
19.切片與索引
函數說明:對數組可以采用0-n的下標進行索引,可以使用冒號分割符start:stop:step進行分割,可使用...來選擇那個維度的元組的長度與數組長度相同
實例:
>>> import numpy as np
>>> a=np.arange(12).reshape(2,3,2)
>>> a
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]]])
>>> a[:,1,:]
array([[2, 3],
[8, 9]])
>>> a[1,1,1]
9
>>> a[...,:,1]
array([[ 1, 3, 5],
[ 7, 9, 11]])
20.整數數組索引
說明:采用整數數組獲取元素,例如[1,2]與[1,2]組合或者四個元素
個人理解:整數數組索引與切片索引是相同的,只不過整數數組的元素較少,可以獲得指定行或者列的元素。
實例:
>>> a=np.arange(2,12).reshape(2,5)
>>> a
array([[ 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11]])
>>> a=np.arange(2,14).reshape(3,4)
>>> a
array([[ 2, 3, 4, 5],
[ 6, 7, 8, 9],
[10, 11, 12, 13]])
>>> a[[0,1],[0,3]]
array([2, 9])
>>> a[[0,2],[3]]
array([ 5, 13])
21.布爾索引
說明:把整數數組中的數字換為布爾值來選擇元素,布爾值為True則選擇,布爾值為False則不選擇;布爾值一般通過布爾運算(例如,比較運算符)來得到。
實例:
>>> a=np.linspace(1,100,15,dtype=int).reshape(3,5)
>>> a
array([[ 1, 8, 15, 22, 29],
[ 36, 43, 50, 57, 64],
[ 71, 78, 85, 92, 100]])
>>> mask=a>50
>>> mask
array([[False, False, False, False, False],
[False, False, False, True, True],
[ True, True, True, True, True]])
>>> a[mask]
array([ 57, 64, 71, 78, 85, 92, 100])
22.花式索引
說明:同樣是利用整數數組進行索引。
個人理解:花式索引的索引數組維度一般小於被索引數組,這樣可以把索引數組的值當做目標數組的某個軸的下標來取值。例如,一維索引數組[1,2],如果目標是一維數組,則得到是第1,和第2個元素,如果目標是二維數組,則得到是0軸的第1和第2行數據。
實例:
>>> a=np.arange(2,100,5).reshape(-1,5)
>>> a
array([[ 2, 7, 12, 17, 22],
[27, 32, 37, 42, 47],
[52, 57, 62, 67, 72],
[77, 82, 87, 92, 97]])
>>> a[[1,2]]
array([[27, 32, 37, 42, 47],
[52, 57, 62, 67, 72]])
>>> a[[-1,0,2]]
array([[77, 82, 87, 92, 97],
[ 2, 7, 12, 17, 22],
[52, 57, 62, 67, 72]])
23.廣播機制
說明:numpy最大最明顯的有點就是廣播機制,去掉了for循環,簡單方便快捷。
個人理解:兩個數組運算的時候,如果其中一個數組的的某個維度為1,則自動觸發廣播機制,numpy會在當前維度的所有數據進行重復計算。
>>> a=np.linspace(2,100,12).reshape(3,4)
>>> a
array([[ 2. , 10.90909091, 19.81818182, 28.72727273],
[ 37.63636364, 46.54545455, 55.45454545, 64.36363636],
[ 73.27272727, 82.18181818, 91.09090909, 100. ]])
>>> b=np.array([1,2,3])
>>> b
array([1, 2, 3])
>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (3,4) (3,)
#注釋說明:個人理解b的shape為(1,3),a與b沒有保證兩者只有一個維度不同。
>>> b=np.array([1,2,3,4])
>>> b
array([1, 2, 3, 4])
>>> a*b
array([[ 2. , 21.81818182, 59.45454545, 114.90909091],
[ 37.63636364, 93.09090909, 166.36363636, 257.45454545],
[ 73.27272727, 164.36363636, 273.27272727, 400. ]])
>>> a+b
array([[ 3. , 12.90909091, 22.81818182, 32.72727273],
[ 38.63636364, 48.54545455, 58.45454545, 68.36363636],
[ 74.27272727, 84.18181818, 94.09090909, 104. ]])
>>> b=np.array([1,2,3]).reshape(3,1)
>>> b
array([[1],
[2],
[3]])
>>> a
array([[ 2. , 10.90909091, 19.81818182, 28.72727273],
[ 37.63636364, 46.54545455, 55.45454545, 64.36363636],
[ 73.27272727, 82.18181818, 91.09090909, 100. ]])
>>> a*b
array([[ 2. , 10.90909091, 19.81818182, 28.72727273],
[ 75.27272727, 93.09090909, 110.90909091, 128.72727273],
[219.81818182, 246.54545455, 273.27272727, 300. ]])
24.np.cumsum(a,axis=None,dtype=None,out=None)
函數說明:對目標數組在指定軸上進行累加計算。
實例:
>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.cumsum(a)
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66])
>>> np.cumsum(a,axis=0)
array([[ 0, 1, 2, 3],
[ 4, 6, 8, 10],
[12, 15, 18, 21]])
#結果說明:
#array([[ 0=0, 1=1, 2=2, 3=3],
# [ 4=0+4, 6=1+5, 8=2+6, 10=3+7],
# [12=0+4+8, 15=1+5+9, 18=2+6+10, 21=3+7+11]])
>>> np.cumsum(a,axis=1)
array([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]])
25.np.eye(N,M=None,k=0,dtype=<class 'float'>,order='C')
函數說明:生成一個指定k對角線為1,其余元素全為0的二維矩陣。
參數說明:N為0維度的長度,M為1維度的長度(若沒有賦值默認為N),k為對角線的位置(=0為主對角,>0為右上對角線,<0為左下對角線)
實例說明:
>>> np.eye(3,dtype=int)
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
>>> np.eye(4,k=1)
array([[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 0.]])
>>> np.eye(4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
>>> np.eye(4,dtype=int)
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
>>> np.eye(4,k=1,dtype=int)
array([[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 0]])
>>> np.eye(4,k=-1,dtype=int)
array([[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]])
>>> np.eye(4,3,k=1)
array([[0., 1., 0.],
[0., 0., 1.],
[0., 0., 0.],
[0., 0., 0.]])
26.np.dientity(n,dtype=None)
函數說明:生成單位方陣(M=N=n),與np.eye的區別是沒有M與k的選項賦值.
實例:
>>> np.identity(4,dtype=int)
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
27.np.meshgrid(x1,x2...xn,sparse=False)
函數說明:生成網格點坐標矩陣。
參數說明:x1,x2....xn表示輸入的每個維度向量,sparse表示是否返回稀疏網絡以節省內存,默認為False。
個人理解:在對數據進行索引的時候例如上面講過的整數/冒號/花式索引等,需要知道每個元素在每個維度的坐標值,例如2*2的矩陣[[1,2],[3,4]],的元素值1所在位置為(0,0),元素值2:(0,1),元素值3:(1,0),元素值4:(1,1),因此
因此可知,每個元素都有對應的在每個維度的索引值。此函數的作用是得到二維/三維/n維度空間內每個元素在每個維度的索引值,常常用在生成元素的坐標索引值,比如在SSD網絡中生成anchor的時候。
實例:
>>> a=np.arange(12,dtype=int).reshape(4,3)
>>> a
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> x=np.arange(4)
>>> x
array([0, 1, 2, 3])
>>> y=np.arange(3)
>>> id1,id0=np.meshgrid(x,y)
>>> id0
array([[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2]])
#說明:每個元素的行坐標值
>>> id1
array([[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]])
#說明:每個元素的列坐標值
28.np.where(condition,x,y)
函數說明:根據condition條件選擇元素,條件為真則返回x,否則返回y。也可以只使用一個condition參數,返回的是索引號。
實例說明:
#只有一個參數condition,返回索引值,可以是數組索引的方式取值
#condition是一維值,返回的是每個符合要求的元素的一維索引值。
>>> a=np.arange(10,dtype=int)
>>> mask=np.where(a>5)
>>> mask
(array([6, 7, 8, 9]),)
>>> a[mask]
array([6, 7, 8, 9])
#conditiion是二維的返回的是每個符合要求的元素的二維索引值。
>>> a=np.arange(12,dtype=int).reshape(3,4)
>>> mask=np.where(a>5)
>>> mask
(array([1, 1, 2, 2, 2, 2]), array([2, 3, 0, 1, 2, 3]))
>>> a[mask]
array([ 6, 7, 8, 9, 10, 11])
#包含condition,x,y三個元素。
>>> a=np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> condition=a>5
>>> condition
array([False, False, False, False, False, False, True, True, True,True])
>>> np.where(condition,1,0)
array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1])
>>> np.where(condition,a,a*10)
array([ 0, 10, 20, 30, 40, 50, 6, 7, 8, 9])
>>> np.where([[True,False],[True,True]],[[1,2],[3,4]],[[9,1],[2,3]])
array([[1, 1],
[3, 4]])
>>> np.where(a<4,a,0)#帶有廣播性質
array([0, 1, 2, 3, 0, 0, 0, 0, 0, 0])
未完待續