一個(gè)栗子 1 >>>import numpy as np 2 3 >>>a = np.arange(15).reshape(3, 5) 4 5 >>>a 6 7 array([[ 0, 1, 2, 3, 4], 8 9 [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) 10 >>>a.shape 11 12 (3, 5) 13 14 >>>a.ndim # 數(shù)組軸的個(gè)數(shù),,在python的世界中,,軸的個(gè)數(shù)被稱作秩 15 16 2 17 18 >>>a.dtype.name 19 20 'int64' 21 22 >>>a.itemsize # 數(shù)組中每個(gè)元素的字節(jié)大小,。 23 24 8 25 26 >>>a.size 27 28 15 29 30 >>>type(a) 31 32 <type 'numpy.ndarray'> 33 34 >>>b = np.array([6, 7, 8]) 35 36 >>>b 37 38 array([6, 7, 8]) 39 40 >>>type(b) 41 42 <type 'numpy.ndarray'> 基本數(shù)據(jù)類型 Numpy 常見的基本數(shù)據(jù)類型如下: 以上這些數(shù)據(jù)類型都可以通過 np.bool_ ,、 np.float32 等方式訪問。 這些類型都可以在創(chuàng)建 ndarray 時(shí)通過參數(shù) dtype 來指定,。 類型轉(zhuǎn)換 要轉(zhuǎn)換數(shù)組的類型,,請(qǐng)使用.astype()方法(首選)或類型本身作為函數(shù)。 1 >>>a 2 3 array([ 0., 1., 2.]) 4 5 >>>a.astype(np.bool_) 6 7 array([False, True, True], dtype=bool) 8 9 >>>np.bool_(a) 10 11 array([False, True, True], dtype=bool) 創(chuàng)建矩陣(采用ndarray對(duì)象) 對(duì)于Python中的numpy模塊,,一般用其提供的ndarray對(duì)象,。創(chuàng)建一個(gè)ndarray對(duì)象很簡(jiǎn)單,只要將一個(gè)list作為參數(shù)即可,。例如: 1 >>>import numpy as np 2 3 #創(chuàng)建一維的narray對(duì)象 4 5 >>>a = np.array([2,3,4]) 6 7 >>>a 8 9 array([2, 3, 4]) 10 11 >>>a.dtype dtype('int64') 12 # 浮點(diǎn)類型 13 14 >>>b = np.array([1.2, 3.5, 5.1]) 15 16 >>>b.dtype 17 18 dtype('float64') 19 20 #創(chuàng)建二維的narray對(duì)象 21 22 >>>a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]]) 23 24 >>>b = np.array([(1.5,2,3), (4,5,6)]) # 使用的是元組 25 26 >>>b 27 28 array([[ 1.5, 2. , 3. ], 29 30 [4. , 5. , 6. ]]) 31 32 #The type of the array can also be explicitly specified at creation time: 33 34 >>> c = np.array( [ [1,2], [3,4] ], dtype=complex ) 35 36 >>> c 37 38 array([[ 1.+0.j, 2.+0.j], 39 40 [3.+0.j, 4.+0.j]]) 矩陣行數(shù)列數(shù)(二維情況) 1 import numpy as np 2 3 a = np.array([[1,2,3,4,5],[6,7,8,9,10]]) 4 5 print(a.shape) #結(jié)果返回一個(gè)tuple元組 (2, 5) 2行,,5列 print(a.shape[0]) #獲得行數(shù),返回 2 print(a.shape[1]) #獲得列數(shù),,返回 5 矩陣的截取 按行列截取 矩陣的截取和list相同,,可以通過[ ](方括號(hào))來截取 1 import numpy as np 2 3 a = np.array([[1,2,3,4,5],[6,7,8,9,10]]) 4 5 print(a[0:1]) #截取第一行,返回 [[1 2 3 4 5]] 6 7 print(a[1,2:5]) #截取第二行,第三,、四,、五列,返回 [8 9 10] 8 9 print(a[1,:]) #截取第二行,返回 [ 6 7 8 9 10] 按條件截取 1 import numpy as np 2 3 a = np.array([[1,2,3,4,5],[6,7,8,9,10]]) 4 5 b = a[a>6] # 截取矩陣a中大于6的元素,,返回的是一維數(shù)組 print(b) # 返回 [ 7 8 9 10] 6 7 #其實(shí)布爾語句首先生成一個(gè)布爾矩陣,,將布爾矩陣傳入[](方括號(hào))實(shí)現(xiàn)截取 print(a>6) 8 9 #返回 10 11 [[False False False False False] 12 13 [False True True True True]] 按條件截取應(yīng)用較多的是對(duì)矩陣中滿足一定條件的元素變成特定的值,。 例如將矩陣中大于6的元素變成0。
import numpy as np a = np.array([[1,2,3,4,5],[6,7,8,9,10]]) print(a) #開始矩陣為 [[ 1 2 3 4 5] [6 7 8 9 10]] >>>a[a>6] = 0 print(a) #大于6清零后矩陣為 [[1 2 3 4 5] [6 0 0 0 0]] >>>y array([[ 0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 31, 32, 33, 34]]) >>>y[b] array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]) Stacking together di?erent arrays
>>>a array([[ 8., 8.], [0., 0.]]) >>>b = np.floor(10*np.random.random((2,2))) >>>b array([[ 1., 8.], [0., 4.]]) >>>np.vstack((a,b)) array([[ 8., 8.], [0., 0.], [1., 8.], [0., 4.]]) >>>np.hstack((a,b)) array([[ 8., 8., 1., 8.], [ 0., 0., 0., 4.]]) 矩陣的合并也可以通過concatenate方法,。 np.concatenate( (a1,a2), axis=0 ) 等價(jià)于 np.vstack( (a1,a2) )
import numpy as np a = np.arange(10) # 默認(rèn)從0開始到10(不包括10),,步長(zhǎng)為1 print(a) # 返回 [0 1 2 3 4 5 6 7 8 9] a1 = np.arange(5,10) # 從5開始到10(不包括10),步長(zhǎng)為1 print(a1) # 返回 [5 6 7 8 9] a2 = np.arange(5,20,2) # 從5開始到20(不包括20),,步長(zhǎng)為2 print(a2) # 返回 [ 5 7 9 11 13 15 17 19] linspace / logspace
import numpy as np # 類似于matlab a = np.linspace(0,10,7) # 生成首位是0,,末位是10,含7個(gè)數(shù)的等差數(shù)列 print(a) #結(jié)果 [ 0. 1.66666667 3.33333333 5. 6.66666667 8.33333333 10. ] >>>a = np.ones(3, dtype=np.int32) # 范圍在‐2147483648‐‐‐2147483647 >>>b = np.linspace(0,pi,3) >>>b.dtype.name 'float64' >>>c = a+b >>>c array([ 1. , 2.57079633, 4.14159265]) >>>c.dtype.name 'float64' >>>d array([ 0.54030231+0.84147098j, ‐0.84147098+0.54030231j, ‐0.54030231‐0.84147098j]) ones,、zeros,、eye、empty
import numpy as np a_ones = np.ones((3,4)) # 創(chuàng)建3*4的全1矩陣 print(a_ones) #結(jié)果 [[ 1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] >>> np.ones((2,3,4), dtype=np.int16 ) # dtype can also be specified 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]]], dtype=int16) # Int16在‐32768 到 +32767之間 a_zeros = np.zeros((3,4)) # 創(chuàng)建3*4的全0矩陣 print(a_zeros) #結(jié)果 [[ 0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] a_eye = np.eye(3) # 創(chuàng)建3階單位矩陣 print(a_eye) #結(jié)果 [[ 1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] a_empty = np.empty((3,4)) # 創(chuàng)建3*4的空矩陣 print(a_empty) #結(jié)果 [[ 1.78006111e‐306 ‐3.13259416e‐294 4.71524461e‐309 1.94927842e+289] #有些矩陣太大,,如果不想省略中間部分,,通過set_printoptions來強(qiáng)制NumPy打印所有數(shù)據(jù)。 >>> np.set_printoptions(threshold='nan') fromstring fromstring()方法可以將字符串轉(zhuǎn)化成ndarray對(duì)象,,需要將字符串?dāng)?shù)字化時(shí)這個(gè)方法比較有用,,可以獲得字符串的ascii碼序列。
a = "abcdef" b = np.fromstring(a,dtype=np.int8) # 因?yàn)橐粋€(gè)字符為8位,,所以指定dtype為np.int8 #一個(gè)字母(例如:a,、#、,!之類的)用了1個(gè)字節(jié)來存儲(chǔ),1byte 即8位. print(b) # 返回 [ 97 98 99 100 101 102] random
>>>a = np.random.random((2,3)) # 產(chǎn)生2行,3列的隨機(jī)矩陣 >>>a array([[ 0.18626021, 0.34556073, 0.39676747], [0.53881673, 0.41919451, 0.6852195 ]]) fromfunction fromfunction()方法可以根據(jù)矩陣的行號(hào)列號(hào)生成矩陣的元素,。 例如創(chuàng)建一個(gè)矩陣,矩陣中的每個(gè)元素都為行號(hào)和列號(hào)的和,。
def func(i,j): return i+j a = np.fromfunction(func,(5,6)) #第一個(gè)參數(shù)為指定函數(shù),,第二個(gè)參數(shù)為列表list或元組tuple,說明矩陣的大小 print(a) #返回 [[ 0. 1. 2. 3. 4. 5.] [1. 2. 3. 4. 5. 6.] [2. 3. 4. 5. 6. 7.] [3. 4. 5. 6. 7. 8.] [4. 5. 6. 7. 8. 9.]] #注意這里行號(hào)的列號(hào)都是從0開始的 矩陣的運(yùn)算
Numpy中的ndarray對(duì)象重載了許多運(yùn)算符,使用這些運(yùn)算符可以完成矩陣間對(duì)應(yīng)元素的運(yùn)算,。 運(yùn)算符 說明
import numpy as np a1 = np.array([[4,5,6],[1,2,3]]) a2 = np.array([[6,5,4],[3,2,1]]) print(a1+a2) # 相加 #結(jié)果 [[10 10 10] [4 4 4]] print(a1/a2) # 整數(shù)相除取商 #結(jié)果 [[0 1 1] [0 1 3]] print(a1%a2) # 相除取余數(shù) #結(jié)果 [[4 0 2] [1 0 0]] 常用矩陣函數(shù) 同樣地,,numpy中也定義了許多函數(shù),,使用這些函數(shù)可以將函數(shù)作用于矩陣中的每個(gè)元素。 表格中默認(rèn)導(dǎo)入了
常用矩陣函數(shù) 說明
import numpy as np a1 = np.array([[1,2,3],[4,5,6]]) # a1為2*3矩陣 a2 = np.array([[1,2],[3,4],[5,6]]) # a2為3*2矩陣 print(a1.shape[1]==a2.shape[0]) # True, 滿足矩陣乘法條件 print(a1.dot(a2)) #a1.dot(a2)相當(dāng)于matlab中的a1*a2 #而Python中的a1*a2相當(dāng)于matlab中的a1.*a2 #結(jié)果 [[22 28] [49 64]] 矩陣的轉(zhuǎn)置 a.T
a = np.array([[1,2,3],[4,5,6]]) print(a.transpose()) #結(jié)果 [[1 4] [2 5] [3 6]] 矩陣的轉(zhuǎn)置還有更簡(jiǎn)單的方法,,就是a.T。
a = np.array([[1,2,3],[4,5,6]]) print(a.T) #結(jié)果 [[1 4] [2 5] [3 6]] 矩陣的逆
import numpy.linalg as lg a = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(lg.inv(a)) #結(jié)果 [[ ‐4.50359963e+15 9.00719925e+15 ‐4.50359963e+15] a = np.eye(3) # 3階單位矩陣 print(lg.inv(a)) # 單位矩陣的逆為他本身 #結(jié)果 [[ 1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] 矩陣信息獲?。ㄈ缇档龋?/p>
a = np.array([[1,2,3],[4,5,6]]) print(a.max()) #獲取整個(gè)矩陣的最大值 結(jié)果: 6 print(a.min()) #結(jié)果:1 #可以指定關(guān)鍵字參數(shù)axis來獲得行最大(小)值或列最大(?。┲?/p> #axis=0 行方向最大(?。┲担传@得每列的最大(?。┲?/p> #axis=1 列方向最大(?。┲担传@得每行的最大(?。┲?/p> #例如 print(a.max(axis=0)) # 每列的最大值 # 結(jié)果為 [4 5 6] print(a.max(axis=1)) # 每行的最大值 #結(jié)果為 [3 6] #要想獲得最大最小值元素所在的位置,,可以通過argmax函數(shù)來獲得 print(a.argmax(axis=1)) #結(jié)果為 [2 2] 平均值
a = np.array([[1,2,3],[4,5,6]]) print(a.mean()) #結(jié)果為: 3.5 #同樣地,,可以通過關(guān)鍵字axis參數(shù)指定沿哪個(gè)方向獲取平均值 print(a.mean(axis=0)) # 結(jié)果 [ 2.5 3.5 4.5] print(a.mean(axis=1)) # 結(jié)果 [ 2. 5.] 方差
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.var()) # 結(jié)果 2.91666666667 print(a.var(axis=0)) # 結(jié)果 [ 2.25 2.25 2.25] print(a.var(axis=1)) # 結(jié)果 [ 0.66666667 0.66666667] 標(biāo)準(zhǔn)差
a = np.array([[1,2,3],[4,5,6]]) print(a.std()) # 結(jié)果 1.70782512766 print(a.std(axis=0)) # 結(jié)果 [ 1.5 1.5 1.5] print(a.std(axis=1)) # 結(jié)果 [ 0.81649658 0.81649658] 中值 中值指的是將序列按大小順序排列后,排在中間的那個(gè)值,,如果有偶數(shù)個(gè)數(shù),,則是排在中間兩個(gè)數(shù)的平均值,。中值 的函數(shù)是median(),調(diào)用方法為numpy.median(x,[axis]),,axis可指定軸方向,,默認(rèn)axis=None,對(duì)所有數(shù)取中值,。
x = np.array([[1,2,3],[4,5,6]]) print(np.median(x)) # 對(duì)所有數(shù)取中值 #結(jié)果 3.5 print(np.median(x,axis=0)) # 沿第一維方向取中值 #結(jié)果 [2.5 3.5 4.5] print(np.median(x,axis=1)) # 沿第二維方向取中值 #結(jié)果 [2. 5.] 求和
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.sum()) # 對(duì)整個(gè)矩陣求和 #結(jié)果 21 print(a.sum(axis=0)) # 對(duì)列方向求和 # 結(jié)果 [5 7 9] print(a.sum(axis=1)) # 對(duì)行方向求和 # 結(jié)果 [ 6 15] 累積和 某位置累積和指的是該位置之前(包括該位置)所有元素的和,。例如序列[1,2,3,4,5],其累計(jì)和為[1,3,6,10,15],,即第一個(gè)元素為1,,第二個(gè)元素為1+2=3,……,,第五個(gè)元素為1+2+3+4+5=15,。矩陣求累積和的函數(shù)是cumsum(),可以對(duì)行,,列,,或整個(gè)矩陣求累積和。
a = np.array([[1,2,3],[4,5,6]]) print(a.cumsum()) # 對(duì)整個(gè)矩陣求累積和 # 結(jié)果 [ 1 3 6 10 15 21] print(a.cumsum(axis=0)) # 對(duì)列方向求累積和 #結(jié)果 [[1 2 3] [5 7 9]] print( a.cumsum(axis=1)) # 對(duì)行方向求累積和 #結(jié)果 [[ 1 3 6] [4 9 15]] 極差
>>>a = np.arange(10) >>>a.ptp() #結(jié)果是 9 百分位數(shù)
numpy.percentile(a, q, axis) 序號(hào) 參數(shù)及描述
加權(quán)平均值
>>>data [1, 2, 3, 4] >>>np.average(data) 2.5 >>>np.average(range(1,11), weights=range(10,0,‐1)) 4.0 >>>data = np.arange(6).reshape((3,2)) >>>data array([[0, 1], [2, 3], [4, 5]]) >>>np.average(data, axis=1, weights=[1./4, 3./4]) array([ 0.75, 2.75, 4.75]) >>>np.average(data, weights=[1./4, 3./4]) Traceback (most recent call last): TypeError: Axis must be specified when shapes of a and weights differ. Shape Manipulation
>>>a = np.floor(10*np.random.random((3,4))) >>>a array([[ 2., 8., 0., 6.], [8., 9., 3., 6.]]) >>>a.shape (3, 4) 數(shù)組的形狀可以用以下方式改變,。Note that the following three commands all return a modified array, but do not change the original array:
array([ 2., 8., 0., 6., 4., 5., 1., 1., 8., 9., 3., 6.]) >>>a.reshape(6,2) # returns the array with a modified shape array([[ 2., 8.], [0., 6.], [4., 5.], [1., 1.], [8., 9.], [3., 6.]]) >>>a.T # returns the array, transposed array([[ 2., 4., 8.], [8., 5., 9.], [0., 1., 3.], [6., 1., 6.]]) >>>a.T.shape (4, 3) >>>a.shape (3, 4)
[8., 9., 3., 6.]]) >>>a.resize((2,6)) >>>a array([[ 2., 8., 0., 6., 4., 5.], If a dimension is given as -1 in a reshaping operation, the other dimensions are automatically calculated:
array([[ 2., 8., 0., 6.], [ 4., 5., 1., 1.], [8., 9., 3., 6.]]) Splitting one array into several smaller ones
>>>a array([[ 9., 5., 6., 3., 6., 8., 0., 7., 9., 7., 2., 7.],
Copies and Views
No Copy At All(完全不復(fù)制) a= b,改變b就相當(dāng)于改變a,或者相反。
>>> b = a # no new object is created >>> b is a # a and b are two names for the same ndarray object True >>>b.shape = 3,4# changes the shape of a >>>a.shape (3, 4) View or Shallow Copy(視圖或淺復(fù)制)
>>>c is a False >>> c.base is a # c is a view of the data owned by a Slicing an array returns a view of it:
>>>s[:] = 10# s[:] is a view of s. Note the difference between s=10 and s[:]=10 >>>a array([[ 0, 10, 10, 3], [1234, 10, 10, 7], [8, 10, 10, 11]]) Deep Copy(深復(fù)制)
The copy method makes a complete copy of the array and its data. >>> d = a.copy() # a new array object with new data is created >>>d is a False # d沒有和a共享任何數(shù)據(jù) >>> d.base is a # d doesn't share anything with a False >>>d[0,0] = 9999 >>>a array([[ 0, 10, 10, 3], [1234, 10, 10, 7], [8, 10, 10, 11]])
copy )。而 b = a[:] 就屬于第二種,,即視圖,,這本質(zhì)上是一種切片操作( slicing ),所有的切片操作返回的
b = a[:] # array([0, 1, 2, 3]) b.flags.owndata # 返回 False,b 并不保管數(shù)據(jù) a.flags.owndata # 返回 True,,數(shù)據(jù)由 a 保管 #改變 a 同時(shí)也影響到 b a[‐1] = 10 # array([0, 1, 2, 10]) b# array([0, 1, 2, 10]) #改變 b 同時(shí)也影響到 a b[0] = 10 # array([10, 1, 2, 10]) a# array([10, 1, 2, 10])
import numpy as np import matplotlib.pyplot as plt def mandelbrot( h,w, maxit=20 ): """Returns an image of the Mandelbrot fractal of size (h,w).""" y,x = np.ogrid[ ‐1.4:1.4:h*1j, ‐2:0.8:w*1j ] c = x+y*1j z = c divtime = maxit + np.zeros(z.shape, dtype=int)
z = z**2 + c diverge = z*np.conj(z) > 2**2 div_now = diverge & (divtime==maxit) divtime[div_now] = i
# who is diverging now # note when z[diverge] = 2 # avoid diverging too much return divtime plt.imshow(mandelbrot(400,400)) plt.show()
|
|