numpy中的數組類型為ndarry
創建
# -*- coding: utf-8 -*- import numpy as np #用列表或元組創建 a = np.array([[1,2,3],[4,5,6]]) b = np.array([1,2],dtype=complex) #類似內置函數range c = np.arange(24).reshape(2,3,4) #等差,等比數組 d = np.linspace(0,1,10,endpoint=False) print np.logspace(0,4,3,base=2) #創建特殊數組 print np.zeros((2,3)) print np.zeros_like(a) print np.ones((2,3),dtype=np.int16) #全1 print np.empty((2,3)) print np.eye(3) #單位陣 #從字符串,函數,文件等創建 s ='abcdef' print np.fromstring(s,dtype=np.int8) print np.fromfunction(lambda i,j:(i+1)*(j+1), (9,9)) #fromfile從二進制文件中創建,tofile寫入文件 #從文件創建 np.savetxt('123.txt',a) #存為文本 e = np.loadtxt('123.txt') #文件操作還有savez,save,load np.save('c.npy', c) #存為二進制,后綴不可變 c = np.load('c.npy') print c np.savez('c.npz', c,d) #存儲多個數組 d = np.load('c.npz') print d['arr_0'], d['arr_1'] c.tofile('c.bin') c = np.fromfile('c.bin',dtype=np.int32) #讀出來是一維的 print c #創建隨機數組 print np.random.random((2,3)) #結構體數組 persontype = np.dtype({'names':['name','age','weight'], 'formats':['S30','i','f']}, align=True) f = np.array([('zhang',32,75.5), ('wang',24,65.2)], dtype=persontype) print f print f['name'] print f[0]['age']
屬性
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) print a.ndim #維數 print a.shape #(3,2) 每個維數的長度 print a.size #元素個數 print a.dtype #float64,元素類型.所有類型可通過set(np.typeDict.values())查看 print a.itemsize #每個元素的字節數 print a.data #緩沖區地址
使用
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) print a[1][2] index = (1,2) print a[index] print a[0:2,1] print a[:,[0,2]] #取第0和2列 print a[1] print a[...,1] for row in a: print row for element in a.flat: print element b = a>4 a[b] = 0 print a
操作
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) #改變大小 a.ravel() #展平為1維數組 print a a.shape = (3,2) #元素在內存中的位置並沒有改變 print a.reshape(2,-1) #a不動,返回改變形狀后的數組,-1對應的維自動計算 a.resize((2,3)) print a #組合 b = np.floor(10*np.random.random((2,3))) print np.vstack((a,b)) print np.hstack((a,b)) #類似還有concatenate, r_, c_ #分割 print np.hsplit(a,3) #復制 c = a #c跟a完全相同 print c is a c = a.view() #c跟a雖是不同數組,但c跟a公用數據. c = a.copy() #深拷貝,c跟a完全不同 print a.repeat(3,axis=0) a = np.array([1,2,3,4,5]) b = np.array([2,4,7]) ax,bx = np.ix_(a,b) print ax.shape print ax*bx #產生能快速廣播的數組 x,y = np.ogrid[:1:4j, :1:3j] #和arange類似,三個產生是開始值,結束值,步長,步長為虛數表示長度 print x print y print 2*x + y x,y = np.mgrid[:1:4j, :1:3j] #與ogrid不同的是,它返回的是廣播后的數組 print x print y
運算
# -*- coding: utf-8 -*- import numpy as np a = np.array([[4,3],[2,1]]) b = np.array([[1,1],[0,1]]) #邏輯運算 print np.logical_or(a==b, a<b) print np.any(a==b) print np.all(a>b) #對每個元素操作 print a<3 print a**2 print a*b a *= 3 np.add(a,b,a) print a #通用函數 print np.exp(a) print np.sort(a) #對每行排序 ''' 當使用ufunc函數對兩個數組進行計算時,ufunc函數會對這兩個數組的對應元素進行計算,因此它要求這兩個數組的形狀相同。如果形狀不同,會進行如下的廣播(broadcasting)處理: 1. 讓所有輸入數組都向其中維數最多的數組看齊,shape屬性中不足的部分都通過在前面加1補齊。 2. 輸出數組的shape屬性是輸入數組的shape屬性的各個軸上的最大值。 3. 如果輸入數組的某個軸的長度為1或與輸出數組的對應軸的長度相同時,這個數組能夠用來計算,否則出錯。 4. 當輸入數組的某個軸的長度為1時,沿着此軸運算時都用此軸上的第一組值。 ''' #將a視為1維數組 print a.max() #a.func()等同於np.func(a) print a.argmin() print a.sum() #以下4個為統計函數 print a.mean() print a.var() print a.std() print np.cov(a) #也可以對指定的維操作,例如 print a.sum(axis=0) print np.add.reduce(a,axis=1) print np.add.accumulate(a,axis=1) #於reduce不同的是它保留中間結果 print np.inner(a,a) #計算兩個數組最后1維的內積 print np.multiply.outer([1,2,3,4,5],[2,3,4]) #先使第一個參數的shape變為(5,1),再multiply,再執行squeeze剔除長度為1的軸
線性代數
# -*- coding: utf-8 -*- import numpy as np import numpy.matlib a = np.array([[1.,2.],[3.,4.]]) b = np.array([[1,1],[0,1]]) print a.transpose() print np.trace(a) print a.trace() print np.linalg.det(a) print np.linalg.eig(a) #特征向量和特征值 print np.dot(a,b) #矩陣乘法 #解方程組 y = np.array([[5.],[7,]]) print np.linalg.solve(a,y) #linalg更多函數見http://docs.scipy.org/doc/numpy/reference/routines.linalg.html #矩陣類繼承自2維數組 A = np.mat(a) print A.T print A.I X = np.matrix('5 6; 7 8').T print A*X print A[:,1] #跟數組不一樣,這里切片的結果還是矩陣 print numpy.matlib.identity(3,dtype=int) #單位陣