您好,登錄后才能下訂單哦!
本文實例講述了Python Numpy庫常見用法。分享給大家供大家參考,具體如下:
Numpy是一個常用的Python科學(xué)技術(shù)庫,通過它可以快速對數(shù)組進行操作,包括形狀操作、排序、選擇、輸入輸出、離散傅立葉變換、基本線性代數(shù),基本統(tǒng)計運算和隨機模擬等。許多Python庫和科學(xué)計算的軟件包都使用Numpy數(shù)組作為操作對象,或者將傳入的Python數(shù)組轉(zhuǎn)化為Numpy數(shù)組,因此在Python中操作數(shù)據(jù)離不開Numpy。
Numpy的核心是ndarray對象,由Python的n維數(shù)組封裝而來,但通過C語言預(yù)編譯相關(guān)的數(shù)組操作,因此比原生Python具有更高的執(zhí)行效率,但仍然使用Python語言編碼,這樣就同時具有簡潔的代碼和高效的運行速度。ndarry與數(shù)組有些區(qū)別值得注意,numpy數(shù)組中的元素都具有相同的類型,并且在創(chuàng)建時就確定了固定的大小,這與Python數(shù)組對象可以動態(tài)增長不同。
Numpy對象的形式是同構(gòu)多維數(shù)組,數(shù)組的維度稱為軸(axis),每個維度上元素的個數(shù)稱為軸的長度。例如下面是一個2×3的二維數(shù)組arr,第一軸長度為3,第二軸長度為2
arr = [[ 1., 0., 0.], [ 0., 1., 2.]]
arr數(shù)組對象常用的屬性如下:
# 數(shù)組軸的個數(shù) arr.ndim # 數(shù)組維度及長度,例如2×3的數(shù)組其shape為(2, 3) arr.shape # 數(shù)組元素的總個數(shù) arr.size # 數(shù)組中元素的數(shù)據(jù)類型 arr.dtype # 數(shù)組中元素所占字節(jié)數(shù) arr.itemsize
可以通過array()方法包裹普通python數(shù)組將其轉(zhuǎn)化為numpy數(shù)組,通過dtype=規(guī)定元素的數(shù)據(jù)類型。數(shù)組可以是二維等高維數(shù)組,也可以是元組的形式。
如果需要填充已知大小的數(shù)組可以使用函數(shù)zeros(),將元素都填充為0,或者ones()將元素填充為1,empty()將元素填充為隨機數(shù)
arange(a,b,c)函數(shù)用于從a到b每隔c長度生成一個數(shù)組元素。linspace(a,b,c)函數(shù)用于在a到b之間生成c個數(shù)組元素
# 普通數(shù)組轉(zhuǎn)化為numpy數(shù)組 a1 = np.array([2, 3, 4], dtype=float) print(a1) # 將元組數(shù)組轉(zhuǎn)化為二維numpy數(shù)組 a2 = np.array([(1, 2, 3), (3, 4, 5)]) print(a2) # 將3×3的數(shù)組用1填充 a3 = np.ones((3, 3)) print(a3) # 從1到10,每隔2生成一個元素 a4 = np.arange(1, 10, 2) print(a4) # 在1到12之間生成4個元素 a5 = np.linspace(1, 12, 4, dtype=int) print(a5) ''' 普通數(shù)組轉(zhuǎn)化為numpy對象: [2. 3. 4.] 元組數(shù)組: [[1 2 3] [3 4 5]] 用1填充數(shù)組: [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]] 從1到10每隔2生成一個元素: [1 3 5 7 9] 在1到12之間生成4個元素: [ 1 4 8 12] '''
算術(shù)運算符可以直接運用在矩陣上,其結(jié)果是將運算應(yīng)用到每個元素上,例如矩陣A*B就是每個元素對應(yīng)相乘,矩陣的乘法運算使用的是@符號
A = np.array([[1, 1], [0, 1]]) B = np.array([[2, 0], [3, 4]]) print(A * B) print(A @ B) ''' 矩陣元素對應(yīng)相乘: [[2 0] [0 4]] 矩陣的乘法: [[5 4] [3 4]] '''
numpy中有些函數(shù)應(yīng)用于整個數(shù)組,例如求和sum、最大值max、最小值min。如果在這些參數(shù)中指定了某個軸,則應(yīng)用于指定軸。
還有一些函數(shù)應(yīng)用于數(shù)組中的具體元素,例如求sin、cos、exp、開方sqrt等,這些函數(shù)叫做通函數(shù)(ufunc)
a = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]) print(a.max()) # 求整體的最大值,結(jié)果為11 print(a.sum(axis=0)) # 求每一列的和,結(jié)果為:[12 15 18 21] print(np.sqrt(a)) # 數(shù)組每個元素求開方
numpy中的數(shù)組同python中的list一樣可以進行索引、切片和迭代操作。數(shù)組a[x]代表訪問數(shù)組a下標為x的元素,一維數(shù)組a[x:y]代表訪問數(shù)組從x到y(tǒng)的元素,如果省略x代表從頭開始,省略y代表直到結(jié)尾。a[x:y:a]代表從x到y(tǒng)每隔a個元素取一個值,如果a為負數(shù),代表逆序取值。
a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) print(a[1:3]) # 輸出下標為1到3的元素:[1 2] print(a[::-2]) # 逆序每隔兩個元素選一個值:[9 7 5 3 1]
如果是多維數(shù)組,則索引之間用逗號分隔??梢允褂?..代表省略某幾個維度,如果省略則會被認為是該維度全部輸出,例如x[...,3]
等效于 x[:,:,:,:,3]
。
可以通過for循環(huán)迭代多為數(shù)組,其內(nèi)容為低一維度的子數(shù)組,如果希望遍歷每一個子元素,可以使用flat屬性。
a = np.array([[0, 1, 2, 3], [10, 11, 12, 13], [40, 41, 42, 43]]) # 輸出a第一維(行)的前三個,第二維(列)下標的1~3 print(a[1:3, 0:3]) # 輸出行的所有,下標為2的列 print(a[2, ...]) # 遍歷數(shù)組 for row in a: print(row) # 遍歷每個子元素 for item in a.flat: print(item) ''' 后兩行的1~3列: [[10 11 12] [40 41 42]] 第三行的所有列: [40 41 42 43] 遍歷數(shù)組: [0 1 2 3] [10 11 12 13] [40 41 42 43] 遍歷每個元素: 0 1 2 ...... 41 42 43 '''
除了使用具體數(shù)字作為索引,還可以使用numpy數(shù)組作為索引。例如使用數(shù)組i作為一維數(shù)組a的索引,輸出a[i]。當數(shù)組i為多維數(shù)組時,從a中選出元素填到i數(shù)組的對應(yīng)位置
a = np.arange(12) ** 2 print(a) i = np.array([1, 3, 5]) print(a[i]) # 多維數(shù)組索引j j = np.array([[3, 4], [9, 7]]) print(a[j]) ''' [ 0 1 4 9 16 25 36 49 64 81 100 121] 數(shù)組a的1、3、5個元素 [ 1 9 25] 通過多為索引j取出a的數(shù)據(jù)填到對應(yīng)位置 [[ 9 16] [81 49]] '''
如果a是多維數(shù)組,索引數(shù)組的單個元素代表選中數(shù)組a的第一個維度
如果對多維數(shù)組在多個維度上進行索引,則傳入多個索引數(shù)組i,j并用逗號分隔
a = np.array(([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])) # 多維數(shù)組的單元素索引 i = np.array([0, 1]) print(a[i]) # 對多維數(shù)組提供多維度索引,同時提供i,j代表取出a的[0,2]、[1,3]兩個元素 j = np.array([2, 3]) print(a[i, j]) ''' 選擇多維數(shù)組a的第0、1兩行: [[0 1 2 3] [4 5 6 7]] a的[0,2]、[1,3]兩個元素: [2 7] '''
數(shù)組的reshape()方法可以將原數(shù)組重構(gòu)成目標維度的數(shù)組,例如將一個2×6的數(shù)組重構(gòu)為3×4的數(shù)組,
數(shù)組在重構(gòu)時不會修改原數(shù)組,而是返回修改后的結(jié)果數(shù)組
值得注意的是數(shù)組在重構(gòu)和打印時都是從最右邊的維度開始往左進行,例如下面的3×4的數(shù)組b,先按行排列4個,然后再換行,排列這樣的3行。如果是多維,則按這樣的行列繼續(xù)輸出。如果數(shù)組維度為-1,則會自動計算該維度的大小,例如含有12個元素的數(shù)組,第二、第三維是3×2,則第一維就是2
ravel()函數(shù)可以將數(shù)組展成一維數(shù)組。
a=np.array([[1,2,3,4,5,6], [7,8,9,10,11,12]]) b=a.reshape(3,4) print(b) # 多維數(shù)組,自動計算 print(a.reshape(-1,3,2)) # 展開數(shù)組 flatted = b.ravel() print(flatted, end=' ') ''' [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] 2×3×2的多維數(shù)組: [[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]]] 展開數(shù)組: [ 1 2 3 4 5 6 7 8 9 10 11 12] '''
numpy的hstack()函數(shù)可以在水平方向上合并多個數(shù)組,vstack()函數(shù)可以在垂直方向上合并多個數(shù)組
相反地,hsplit()、vsplit()可以拆分為指定數(shù)量的數(shù)組
a=np.array([1,2,3]) b=np.array([4,5,6]) # 垂直方向合并 c=np.vstack((a,b)) print(c) # 水平方向合并 print(np.hstack((a,b))) # 水平方向拆分 print(np.hsplit(c,3)) ''' 垂直堆疊 [[1 2 3] [4 5 6]] 水平合并 [1 2 3 4 5 6] 水平拆分為三個1×2的: [array([[1], [4]]), array([[2], [5]]), array([[3], [6]])] '''
當一個數(shù)組對象賦值給一個新的變量時,是新開辟一個存儲空間還是只是傳遞一個引用?答案是引用。
例如執(zhí)行語句b=a,只是將一個引用傳給了b,對b執(zhí)行的操作會直接影響a。查看a、b兩個對象的節(jié)點id也是一樣的
a = np.array([1, 2, 3]) b = a # 修改b b[0] = 0 print(a) # 輸出a、b對象的id print(id(a), id(b)) ''' 修改b,a也發(fā)生了變化 [0 2 3] 查看二者的id 2290013812656 2290013812656 '''
通過切片返回數(shù)組的視圖,修改視圖的形狀不會影響原數(shù)組,但是在視圖上修改數(shù)據(jù)原數(shù)組也會改變。在執(zhí)行del a之后,由于c引用了a,a依舊會存在內(nèi)存中不會被刪除
c = a[:] # 修改視圖的形狀 c.shape = 3, 1 print(c, a) # 修改視圖c的數(shù)據(jù) c[0] = 1 print(a[0]) ''' 對視圖c的形狀做修改,a不會受到影響 [[0] [2] [3]] [0 2 3] 修改c的數(shù)據(jù),a也會隨之改變: 1
通過copy()方法可以生成數(shù)據(jù)的副本,因此對副本的操作完全不會影響原數(shù)組
d= a.copy() d[0]=5 # 修改數(shù)組的副本d,a不受影響,輸出a:[1 2 3] print(a)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。