Python 中的numpy 库
待總結
用scikit-learn和pandas學習線性回歸
用scikit-learn和pandas學習Ridge回歸
待整理的
Numpy & Pandas
numpy——主要對其 N 維數組對象有用 http://www.numpy.org/
Pandas數據轉為 numpy數據
df_numpyMatrix = df.as_matrix() df_numpyMatrix=df.values a=([3.234,34,3.777,6.33])#a為python的list類型 #將a轉化為numpy的array: np.array(a)array([ 3.234, 34. , 3.777, 6.33 ]) #將a轉化為python的list a.tolist()python中list與array互相轉換
u = array([[1,2],[3,4]]) m = u.tolist() #轉換為list m.remove(m[0]) #移除m[0] m = np.array(m) #轉換為arraynumpy庫是數值計算,NumPy為Python帶來了真正的多維數組功能,并且提供了豐富的函數庫處理這些數組。它將常用的數學函數都進行數組化,使得這些數學函數能夠直接對數組進行操作。NumPy為Python提供了快速的多維數組處理的能力,但是它不能用來做各種科學計算,這時候就需要scipy了。
NumPy小抄
#array initialization import numpy as np np.array([2, 3, 4]) np.empty(20, dtype=np.float32) np.zeros(200) np.ones((3,3), dtype=np.int32) np.eye(200) np.zeros_like(a) np.linspace(0., 10., 100) # 100 points from o to 10 np.arange(0, 100, 2) np.logspace(-5, 2, 100) #100 log-spaces points between -5 and 2 np.copy(a) # copy array to new memory #數學本質是一種截斷.clip的第一個參數表示目標區間最小值,第二個參數表示最大值,原始序列凡小于這個最小值的被這個最小值所替換,凡大于這個最大值的被這個最大值替換,必須指定一個參數,則另一個參數默認為∞。 np.clip() import numpy as np array = np.array([[1,2,3],[2,3,4]]) print(array) print('number of dim:',array.ndim) #矩陣的維度 print('shape:',array.shape) # 矩陣的大小 print('size:',array.size) #矩陣的元素個數 # 數組的type a = np.array([2,3,4],dtype=np.int64) print(a.dtype) a = np.array([2,3,4],dtype=np.float)#default is float64 print(a.dtype) a = np.array([2,3,4],dtype=np.float32) print(a.dtype) # 創建各種各樣的array矩陣和數組a = np.array([2,3,5]) print(a)a = np.zeros((3,4),dtype=np.int32) #生成一個零矩陣 a = np.ones((3,4),dtype=np.int64)# 生成一個單位矩陣 a = np.empyt((3,4))# 生成一個空矩陣a = np.arange(10,20,2)#生成一個數列,從10到20,步長為2,有序數列 a = np.arange(12).reshape((3,4)) #生成一個矩陣,可定義shape a = np.linspace(1,10,20).reshape((4,5)) #生成一個從1到10的數列,有20段,有序矩陣。class_pred = np.array([]) class_actual=np.array([]) ss = np.array([]).reshape(-1,2)array([], dtype=float64) array([], dtype=float64) array([], shape=(0, 2), dtype=float64)print(class_pred.shape, type(class_pred), class_actual.shape, type(class_actual), ss.shape, type(ss))((0,), <type 'numpy.ndarray'>, (0,), <type 'numpy.ndarray'>, (0, 2), <type 'numpy.ndarray'>)
Reading/ Writing files
np.fromfile(fname/object, dtype=np.float32, count=5) np.loadtxt(fname/object, skiprows=2, delimiter=',')
indexing
a = np.arange(100) a[:3] = 0 a[2:5] = 1 #set indices 2-4 to 1 a[start:stop:step] a[None, :] a[[1, 1, 3, 8]] a = a.reshape(10, 10) # transform to 10 x 10 matrix a.T #return transposed view b = np.transpose(a, (1,0)) a[a<2] #索引 import numpy as np A =np.arange(2,14).reshape((3,4)) print(A)print(np.argmin(A)) print(np.argmax(A))print(np.mean(A)) print(A.mean()) print(np.average(A))print(np.median(A))print(A) print(np.cumsum(A)) #逐步累加print(np.diff(A)) #前后之差,類差print(np.nonzero(A))print(np.sort(A))print(np.transpose(A)) #矩陣的轉置 print(A.T)print((A.T).dot(A)) # A'Aprint(np.clip(A,5,9)) #矩陣的截斷,小于5為5,大于9的為9import numpy as np A = np.arange(3,15) print(A)print(A[3])A = np.arange(3,15).reshape((3,4)) print(A)print(A[3])#輸出1行1列 print(A[1][1]) print(A[1,1])print(A[2,:]) #2行 print(A[:,1])#1列print(A[1,1:3])#輸出每一行 for row in A:print(row)# 輸出一列 for column in A.T:print(column)#輸出每一個元素 print(A.flatten()) #返回所有值for item in A.flat:print(item)
array properties and operations
a.shape len(a) a.ndim a.sort(axis=1) a.flatten() a.conj() a.astype(np.int16)#numpy中的數據類型轉換,不能直接改原數據的dtype! 只能用函數astype() np.argmax(a, axis=1) np.cumsum(a) np.any(a) np.all(a) np.argsort(a, axis =1) np.linalg.norm 顧名思義,linalg=linear+algebra,norm則表示范數,首先需要注意的是范數是對向量(或者矩陣)的度量,是一個標量(scalar):
numpy數據類型dtype轉換,astype
a = np.random.random(4) >>> a array([ 0.0945377 , 0.52199916, 0.62490646, 0.21260126]) >>> a.dtype dtype(‘float64‘) >>> a.shape (4,)#改變dtype,發現數組長度翻倍! >>> a.dtype = ‘float32‘ >>> a array([ 3.65532693e+20, 1.43907535e+00, -3.31994873e-25,1.75549972e+00, -2.75686653e+14, 1.78122652e+00,-1.03207532e-19, 1.58760118e+00], dtype=float32) >>> a.shape (8,)#用 astype(int) 得到整數,并且不改變數組長度 b = np.array([1., 2., 3., 4.]) print(b.dtype, b.shape, b) c = b.astype(int) print(c.dtype, c.shape, c)(dtype('float64'), (4,), array([ 1., 2., 3., 4.])) (dtype('int64'), (4,), array([1, 2, 3, 4]))詳細參考見numpy數據類型dtype轉換
x = np.array([3, 4]) np.linalg.norm(x) # 默認二范數 5. np.linalg.norm(x, ord=2) #二范數 ?2:sqrt(x1^2+x2^2+…+xn^2) 5. np.linalg.norm(x, ord=1) # 1 范數 ?1:|x1|+|x2|+…+|xn| 7. np.linalg.norm(x, ord=np.inf) #無窮范數 ?∞:max(|xi|)范數理論的一個小推論告訴我們:?1≥?2≥?∞
boolean arrays
a < 2 (a < 2) & (b > 10) # elementwise logical and (a < 2) | (b > 10) # elementwise logical or ~ a # invert boolean array
# elementwise operations and math functions
a*2 a + 5 a + b a / b np.exp(a) # exponential (complex and real) np.power(a, b) # a to the power b np.sin(a) np.cos(a) np.arctan2(a,b) np.arcsin(a) np.radians(a) # degrees to radians np.degrees(a) # radians to degrees np.var(a) #variance of array np.std(a, axis=1) #standard deviation # numpy 中的基礎運算 import numpy as np a = np.array([10,20,30,40]) b = np.arange(4) print(a,b)c = a + b c = b**2 # b^2 c = b**4 # b^4c = 10*np.sin(a) c = 10*np.cos(b) c = 10*np.tan(a) print(c)print(b) print(b<3) print(b==3)#矩陣的運算 import numpy as np a = np.array([[1,1],[0,1]]) b = np.arange(4).reshape((2,3))print(a,b) #逐個乘法 c = a*b c_dot=np.dot(a,b) #矩陣乘法 c_dot2=a.dot(b)#矩陣乘法 print(c) print(c_dot) print(c_dot2)import numpy as np a =np.random.random((2,4)) # 隨機生成的矩陣,從0都1中 print(np.sum(a)) print(np.min(a)) print(np.max(a))print(np.sum(a,axis=1)) #對行計算 print(np.min(a,axis=0)) #對列中求最小值 print(np.max(a,axis =1))#對行中求最大值
numpy的array合并
import numpy as npA = np.array([1,1,1]) B = np.array([2,2,2])C = np.vstack((A,B))# vertical stack 上下合并,豎直方向 print(C) print(A.shape,C.shape) np.vstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 2, 3],[4, 5, 6]])np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 4],[2, 5],[3, 6]])D = np.hstack((A,B)) # horizontal stack 左右合并,水平方向 print(D) print(A.shape,D.shape)np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([1, 2, 3, 4, 5, 6]) # 兩者近乎等效 np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 2, 3],[4, 5, 6]])print(A.T.shape) print(A[np.newaxis,:].shape) print(A[:,np.newaxis].shape)#多個合并 C =np.concatenate((A,B,A,B,A,A)) print(C)#行和列合并 C = np.concatenate((A,B,A,B,A,A),axis=1) C = np.concatenate((A,B,A,B,A,A),axis=0) print(C) np.concatenate((a, b), axis=0) == np.vstack((a, b))# 也對應于默認的情況,np.concatenate((a, b)) np.concatenate((a, b), axis=1) == np.hstack((a, b)) a = np.ndarray((3, 2, 3)) b = np.ndarray((2, 2, 3)) print(a.shape, b.shape) (3, 2, 3) (2, 2, 3) c = np.concatenate((a, b), axis = 0) print(c.shape) (5, 2, 3) #append,矩陣的追加是采用append這個函數 a = np.array([1, 2, 3, 4, 5]) a = np.append(a, 10) array([ 1, 2, 3, 4, 5, 10])a = np.append(a, [1, 2, 3]) array([ 1, 2, 3, 4, 5, 10, 1, 2, 3]) #列表的擴展(extend), 列表的擴展就是把兩個列表合并,采用extend函數 a = [1, 2, 3, 4] b = [5, 6, 7, 8] c = a.extend(b) c a [1, 2, 3, 4, 5, 6, 7, 8] 請注意extend這個函數的返回值是None,所以上面c的輸出為空,而a的值已經變了,所以它是直接在a后面擴展的,并沒有任何返回值。 #列表的追加直接用append就行 a = [1, 2,3,4] a.append(6) [1, 2, 3, 4, 6]
numpy數組拼接方法介紹
#思路:首先將數組轉成列表,然后利用列表的拼接函數append()、extend()等進行拼接處理,最后將列表轉成數組 >>> import numpy as np >>> a=np.array([1,2,5]) >>> b=np.array([10,12,15]) >>> a_list=list(a) >>> b_list=list(b) >>> a_list.extend(b_list) >>> a_list [1, 2, 5, 10, 12, 15] >>> a=np.array(a_list) >>> a array([ 1, 2, 5, 10, 12, 15])該方法只適用于簡單的一維數組拼接 #思路:numpy提供了numpy.append(arr, values, axis=None)函數。對于參數規定,要么一個數組和一個數值;要么兩個數組,不能三個及以上數組直接append拼接。append函數返回的始終是一個一維數組。 >>> a=np.arange(5) >>> a array([0, 1, 2, 3, 4]) >>> np.append(a,10) array([ 0, 1, 2, 3, 4, 10]) >>> a array([0, 1, 2, 3, 4])>>> b=np.array([11,22,33]) >>> b array([11, 22, 33]) >>> np.append(a,b) array([ 0, 1, 2, 3, 4, 11, 22, 33]) #numpy的數組沒有動態改變大小的功能,numpy.append()函數每次都會重新分配整個數組,并把原來的數組復制到新數組中。 #思路:numpy提供了numpy.concatenate((a1,a2,...), axis=0)函數。能夠一次完成多個數組的拼接。其中a1,a2,...是數組類型的參數 >>> a=np.array([1,2,3]) >>> b=np.array([11,22,33]) >>> c=np.array([44,55,66]) >>> np.concatenate((a,b,c),axis=0) # 默認情況下,axis=0可以不寫 array([ 1, 2, 3, 11, 22, 33, 44, 55, 66]) #對于一維數組拼接,axis的值不影響最后的結果>>> a=np.array([[1,2,3],[4,5,6]]) >>> b=np.array([[11,21,31],[7,8,9]]) >>> np.concatenate((a,b),axis=0) array([[ 1, 2, 3],[ 4, 5, 6],[11, 21, 31],[ 7, 8, 9]]) >>> np.concatenate((a,b),axis=1) #axis=1表示對應行的數組進行拼接 array([[ 1, 2, 3, 11, 21, 31],[ 4, 5, 6, 7, 8, 9]])numpy的array分割
import numpy as np A = np.arange(12).reshape((3,4))print(A) print(np.split(A,2,axis=1))#列,縱向 print(np.split(A,3,axis=0))#行分割print(np.split(A,3,axis=1))# 不可分割成不相等的分割,列方向#不等的分割 print(np.array_split(A,3,axis=1))#列不等的分割print(np.vsplit(A,3)) # 縱向分割,行分割 print(np.hsplit(A,2)) #橫向分割,列分割
numpy 的copy
#numpy的賦值有關聯,也就是說a,b,c,d任何一個值變化,其他值也會有變化import numpy as np a = np.arange(4)#有序數列 b = a c = a d = bd[1:3] =[22,33]d is a b is a #不關聯的賦值 b = a.copy() #deep copy print(b) a[3]=44 print(a,b)
inner/ outer products
np.dot(a, b) np.einsum('ij,kj->ik', a, b) np.sum(a, axis=1) np.abs(a) a[None, :] + b[:, None] a[None, :] * b[:, None] np.outer(a, b) np.sum(a * a.T)
interpolation, integration
np.trapz(a, x=x, axis=1) np.interp(x, xp, yp)
fft
np.fft.fft(a) f = np.fft.fftfreq(len(a)) np.fft.fftshift(f) np.fft.rfft(a) np.fft.rfftfreq(len(a))
rounding
np.ceil(a) # rounds to nearest upper int np.floor(a) # rounds to nearest lower int np.round(a) # runds to nearest int
random variables
np.random.normal(loc=0, scale=2, size=100) np.random.seed(23032) np.random.rand(200) np.random.uniform(1, 30, 200) np.random.randint(1, 16, 300)
本文中的 numpy.ipynb 格式可見我的CSDN下載。
#https://python.freelycode.com/contribution/detail/340 #http://www.datadependence.com/2016/05/scientific-python-numpy/ #Python科學計算之NumPy #NumPy是Python用于處理大型矩陣的一個速度極快的數學庫。 #它允許你在Python中做向量和矩陣的運算,而且很多底層的函數都是用C寫的, #你將獲得在普通Python中無法達到的運行速度。 #數組基礎 #NumPy的功能圍繞著一些叫數組的東西。其實NP矩陣,但我們并不需要擔心。 #有了這些數組,我們可以做各種有用的東西,如快速處理向量和矩陣數學。#創建一個數組4種不同的方法。最基本的方法就是傳遞一個序列給NumPy的array()函數; #你可以傳遞給它任何的序列,不僅僅是你通??吹降牧斜?。import numpy as np # 1D Array a = np.array([0, 1, 2, 3, 4]) b = np.array((0, 1, 2, 3, 4)) c = np.arange(5) d = np.linspace(0, 2*np.pi, 5)print(a) print(b) print(c) print(d) print(a[3]) [0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4] [ 0. 1.57079633 3.14159265 4.71238898 6.28318531] 3 #上面的數組例子是如何用NumPy表示一個向量。 #接下來我們就來看看我們如何可以展示矩陣和更多的多維數組。 aa = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25],[26, 27, 28, 29, 30],[31, 32, 33, 34, 35]])print(aa) print(aa[2,4]) [[11 12 13 14 15][16 17 18 19 20][21 22 23 24 25][26 27 28 29 30][31 32 33 34 35]] 25 #向量是同時具有方向和大小的量。 #矩陣類似于向量,除了它是由行和列組成外,更像一個網格。矩陣中的值可以通過給對應的行和列來引用 #多維數組切片 import numpy as np # MD slicing print(aa[0, 1:4]) print(aa[1:4, 0]) print(aa[::2, ::2]) print(aa[:, 1]) [12 13 14] [16 21 26] [[11 13 15][21 23 25][31 33 35]] [12 17 22 27 32] #數組屬性 aa = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25],[26, 27, 28, 29, 30],[31, 32, 33, 34, 35]]) print(type(aa)) print(aa.dtype) print(aa.size) print(aa.shape) print(aa.itemsize) #“itemsize”屬性是每項占用了多少個字節,int64有64位,每個字節8位 print(aa.ndim) #“ndim”屬性是指某個數組是幾維的 print(aa.nbytes) #“nbytes”屬性是某個數組中所有數據所占用的字節 <class 'numpy.ndarray'> int64 25 (5, 5) 8 2 200 #處理數組 #基本操作 # Basic Operators aaa = np.arange(25) print(aaa) aaa = aaa.reshape((5, 5)) print(aaa) bbb = np.array([10, 62, 1, 14, 2, 56, 79, 2, 1, 45,4, 92, 5, 55, 63, 45, 45, 3, 123, 45,34,5,67, 23,456]) print(bbb) bbb = bbb.reshape((5,5)) print(bbb)print( aaa + bbb) print(aaa -bbb) print(aaa*bbb) print(aaa/bbb) print(aaa**2) print(aaa<bbb) print(aaa>bbb) print(aaa.dot(bbb)) #dot()函數計算出兩個數組的點積 [ 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] [[ 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]] [ 10 62 1 14 2 56 79 2 1 45 4 92 5 55 63 45 45 3123 45 34 5 67 23 456] [[ 10 62 1 14 2][ 56 79 2 1 45][ 4 92 5 55 63][ 45 45 3 123 45][ 34 5 67 23 456]] [[ 10 63 3 17 6][ 61 85 9 9 54][ 14 103 17 68 77][ 60 61 20 141 64][ 54 26 89 46 480]] [[ -10 -61 1 -11 2][ -51 -73 5 7 -36][ 6 -81 7 -42 -49][ -30 -29 14 -105 -26][ -14 16 -45 0 -432]] [[ 0 62 2 42 8][ 280 474 14 8 405][ 40 1012 60 715 882][ 675 720 51 2214 855][ 680 105 1474 529 10944]] [[ 0. 0.01612903 2. 0.21428571 2. ][ 0.08928571 0.07594937 3.5 8. 0.2 ][ 2.5 0.11956522 2.4 0.23636364 0.22222222][ 0.33333333 0.35555556 5.66666667 0.14634146 0.42222222][ 0.58823529 4.2 0.32835821 1. 0.05263158]] [[ 0 1 4 9 16][ 25 36 49 64 81][100 121 144 169 196][225 256 289 324 361][400 441 484 529 576]] [[ True True False True False][ True True False False True][False True False True True][ True True False True True][ True False True False True]] [[False False True False True][False False True True False][ True False True False False][False False True False False][False True False False False]] [[ 335 418 289 572 2130][ 1080 1833 679 1652 5185][ 1825 3248 1069 2732 8240][ 2570 4663 1459 3812 11295][ 3315 6078 1849 4892 14350]] #數組中特定的操作 # dot, sum, min, max, cumsum a4 = np.arange(10) print(a4.sum()) print(a4.min()) print(a4.max()) print(a4.cumsum()) #cumsum()逐項相加之和 45 0 9 [ 0 1 3 6 10 15 21 28 36 45] print(a4) [0 1 2 3 4 5 6 7 8 9] #高級索引 #奇特的索引 # Fancy indexing a5 = np.arange(0, 100, 10) indices = [1, 5, -1] b5 = a5[indices] print(a5) print(b5) [ 0 10 20 30 40 50 60 70 80 90] [10 50 90] #布爾屏蔽 #布爾屏蔽是一個奇妙的特性,它允許我們按照我們指定的條件來檢索元素。 # Boolean masking import matplotlib.pyplot as plt a6 = np.linspace(0, 2*np.pi, 50) b6 = np.sin(a6) plt.plot(a6,b6) mask = b6 >=0 plt.plot(a6[mask], b6[mask], 'bo') mask = (b6 >=0) & (a6 <= np.pi/2) plt.plot(a6[mask], b6[mask], 'go') plt.show() #不完整的索引 #Incomplete Indexing a7 = np.arange(0,100,10) b7 = a7[:5] c7 = a7[a7 >=50] print(b7) print(c7) [ 0 10 20 30 40] [50 60 70 80 90] #Where,當需要以特定條件來檢索數組元素的時候。 #只需要傳遞給它一個條件,它將返回符合條件的元素列表。 # where a8 = np.arange(0,100,10) b8 = np.where(a8<50) c8 = np.where(a8>=50)[0] print(b8) print(c8) (array([0, 1, 2, 3, 4]),) [5 6 7 8 9]
numpy 辨異函數
np.repeat 與 np.tile 二者執行的是均是復制操作; np.repeat:復制的是多維數組的每一個元素; np.tile:復制的是多維數組本身; #np.repeat >> x = np.arange(1, 5).reshape(2, 2) >> np.repeat(x, 2) array([1, 1, 2, 2, 3, 3, 4, 4])# 對數組中的每一個元素進行復制# 除了待重復的數組之外,只有一個額外的參數時,高維數組也會 flatten 至一維 #在行的方向上(axis=1),在列的方向上(axis=0) >> np.repeat(x, 3, axis=1) array([[1, 1, 1, 2, 2, 2],[3, 3, 3, 4, 4, 4]]) >> np.repeat(x, 3, axis=0) array([[1, 2],[1, 2],[1, 2],[3, 4],[3, 4],[3, 4]]) #numpy 下的 np.tile有些類似于 matlab 中的 repmat函數。不需要 axis 關鍵字參數,僅通過第二個參數便可指定在各個軸上的復制倍數。 >> a = np.arange(3) >> np.tile(a, 2) array([0, 1, 2, 0, 1, 2]) >> np.tile(a, (2, 2)) array([[0, 1, 2, 0, 1, 2],[0, 1, 2, 0, 1, 2]])>> b = np.arange(1, 5).reshape(2, 2) >> np.tile(b, 2) array([[1, 2, 1, 2],[3, 4, 3, 4]])# 等價于 >> np.tile(b, (1, 2))References
Python科學計算之NumPy
An Introduction to Scientific Python – NumPy
機器學習入門必備的13張小抄
numpy教程 pandas教程 Python數據科學計算簡介
總結
以上是生活随笔為你收集整理的Python 中的numpy 库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何向IPython Notebook中
- 下一篇: Python 中的Pandas库