詳解Numpy中的數(shù)組
Numpy定義
NumPy(Numerical Python) 是 Python 語(yǔ)言的一個(gè)擴(kuò)展程序庫(kù),支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫(kù))一起使用,這種組合廣泛用于替代 MatLab,是一個(gè)強(qiáng)大的科學(xué)計(jì)算環(huán)境,有助于我們通過(guò) Python 學(xué)習(xí)數(shù)據(jù)科學(xué)或者機(jī)器學(xué)習(xí)。
NumPy 主要應(yīng)用包括:
機(jī)器學(xué)習(xí)模型:在編寫機(jī)器學(xué)習(xí)算法時(shí),需要對(duì)矩陣進(jìn)行各種數(shù)值計(jì)算。例如矩陣乘法、換位、加法等。NumPy提供了一個(gè)非常好的庫(kù),用于簡(jiǎn)單(在編寫代碼方面)和快速(在速度方面)計(jì)算。NumPy數(shù)組用于存儲(chǔ)訓(xùn)練數(shù)據(jù)和機(jī)器學(xué)習(xí)模型的參數(shù)。
圖像處理和計(jì)算機(jī)圖形學(xué):計(jì)算機(jī)中的圖像表示為多維數(shù)字?jǐn)?shù)組。NumPy成為同樣情況下最自然的選擇。實(shí)際上,NumPy提供了一些優(yōu)秀的庫(kù)函數(shù)來(lái)快速處理圖像。例如,鏡像圖像、按特定角度旋轉(zhuǎn)圖像等。
數(shù)學(xué)任務(wù):NumPy對(duì)于執(zhí)行各種數(shù)學(xué)任務(wù)非常有用,如數(shù)值積分、微分、內(nèi)插、外推等。因此,當(dāng)涉及到數(shù)學(xué)任務(wù)時(shí),它形成了一種基于Python的MATLAB的快速替代。
為什么要用numpy
Python中提供了list容器,可以當(dāng)作數(shù)組使用。但列表中的元素可以是任何對(duì)象,因此列表中保存的是對(duì)象的指針,這樣一來(lái),為了保存一個(gè)簡(jiǎn)單的列表[1,2,3]。就需要三個(gè)指針和三個(gè)整數(shù)對(duì)象。對(duì)于數(shù)值運(yùn)算來(lái)說(shuō),這種結(jié)構(gòu)顯然不夠高效。Python雖然也提供了array模塊,但其只支持一維數(shù)組,不支持多維數(shù)組(在TensorFlow里面偏向于矩陣?yán)斫?,也沒(méi)有各種運(yùn)算函數(shù)。因而不適合數(shù)值運(yùn)算。NumPy的出現(xiàn)彌補(bǔ)了這些不足。(——摘自張若愚的《Python科學(xué)計(jì)算》)
詳情請(qǐng)參考:
https://numpy.org/doc/stable/index.html
NumPy安裝
因?yàn)閚umpy通常跟 scipy matplotlib一起使用,所以一起安裝三個(gè)模塊即可
pip3 install --user numpy scipy matplotlib
numpy array基礎(chǔ)使用
np數(shù)組的創(chuàng)建
- import numpy as np
- a = np.array([1,2,3,4]),#1行4列矩陣,即一維數(shù)組
- b = np.arange(4) # 1行4列矩陣,元素遞增1的一維數(shù)組
- c = np.array([[1,2],[3,4]]) # 2行2列矩陣,即二維數(shù)組d = np.arange(4).reshape((2,2)) #變換輸出 2行2列print (a)
- print(type(a)) #輸出a的類型print (b)
- print (c)
- print (d)
分別輸出:
- [1 2 3 4]
- [0 1 2 3]
- [[1 2]
- [3 4]]
- [[0 1]
- [2 3]]
np數(shù)組的廣播
廣播(Broadcast)是 numpy 對(duì)不同形狀(shape)的數(shù)組進(jìn)行數(shù)值計(jì)算的方式,對(duì)數(shù)組的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行。如果兩個(gè)數(shù)組 a 和 b 形狀相同,即滿足a.shape == b.shape,那么 a*b 的結(jié)果就是 a 與 b 數(shù)組對(duì)應(yīng)位相乘。這要求維數(shù)相同,且各維度的長(zhǎng)度相同。
例如代碼
- a = np.array([1,2,3])
- b = np.array([10,20,30])
- c = a * b
- print (c)
輸出
- [10 40 90]
數(shù)組廣播相加操作
- a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) #4x3 的二維數(shù)組
- b = np.array([1,2,3])
- print(a + b)
輸出
- [[11 12 13]
- [2122 23]]
下面的圖片展示了數(shù)組 b 如何通過(guò)廣播來(lái)與數(shù)組 a 兼容。4x3 的二維數(shù)組與長(zhǎng)為 3 的一維數(shù)組相加,等效于把數(shù)組 b 在二維上重復(fù) 4 次再運(yùn)算:

np數(shù)組的切片和索引
ndarray對(duì)象的內(nèi)容可以通過(guò)索引或切片來(lái)訪問(wèn)和修改,與 Python 中 list 的切片操作一樣。ndarray數(shù)組可以基于0-n的下標(biāo)進(jìn)行索引,切片對(duì)象可以通過(guò)內(nèi)置的 slice 函數(shù),并設(shè)置 start, stop 及 step 參數(shù)進(jìn)行,從原數(shù)組中切割出一個(gè)新數(shù)組。相信大家理解python list切片相關(guān)操作,一定會(huì)對(duì)該部分的內(nèi)容感到熟悉,這里舉幾個(gè)經(jīng)典的例子:
基礎(chǔ)實(shí)例
- import numpy as np
- a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
- b = a[5] #下標(biāo)5元素的值
- c = np.array([[1,2,3],[3,4,5],[6,7,8]])print(b)
- print(a[3:5]) #輸出下標(biāo)3-5的值,注意這里可以輸出下限3,而不包括上限5
- print(c[0,0]) #輸出第一行第一列的元素即[1,2,3]中的1
- print (c[...,1]) #第2列元素print (c[1,...]) # 第2行元素print (c[...,1:]) # 第2列及剩下的所有元素
輸出
- 5
- [3 4]
- 1
- [2 4 7]
- [3 4 5]
- [[2 3]
- [45]
- [78]]
布爾索引實(shí)例
我們可以通過(guò)一個(gè)布爾數(shù)組來(lái)索引目標(biāo)數(shù)組。布爾索引通過(guò)布爾運(yùn)算(如:比較運(yùn)算符)來(lái)獲取符合指定條件的元素的數(shù)組。
- c = np.array([[1,2,3],[3,4,5],[6,7,8]])
- print (c[c > 3]) #打印出大于3的元素
輸出
- [4 5 6 7 8]
numpy array遍歷
直接上代碼,普通一維數(shù)組
- arr = np.array([1, 2, 3])
- for x in arr:
- print(x)
輸出
- 1
- 2
- 3
定義一個(gè)numpy的二維數(shù)組,二維以上的數(shù)組這里不做討論
- arr = np.array([[1, 2, 3], [4, 5, 6]])
- #遍歷
- for x in arr:
- print(x)
輸出
- [1 2 3]
- [4 5 6]
如果想一個(gè)一個(gè)地輸出每一個(gè)元素,可以這樣編寫代碼
- for x in arr:
- for y in x:
- print(y)
輸出
- 1
- 2
- 3
- 4
- 5
- 6
上面的方式比較麻煩,我們可以通過(guò)方法np.nditer實(shí)現(xiàn)一個(gè)一個(gè)地輸出每一個(gè)元素
- for x in np.nditer(arr):
- print(x)
輸出
- 1
- 2
- 3
- 4
- 5
- 6
numpy array元素過(guò)濾
實(shí)例,在np數(shù)組中,過(guò)濾大于2的元素
- arr = np.array([1, 2, 3, 4])
- newarr = arr[arr >2]
- print(newarr)
輸出
- [3 4]
怎么樣,是不是非常非常簡(jiǎn)單!
numpy array 關(guān)于字符的處理
如果np數(shù)組中存儲(chǔ)的是字符,如果相對(duì)字符元素進(jìn)行相關(guān)操作,需要使用api —np.char
有這樣一個(gè)需求,把字符'0.01%','1.1%','1.21%' 中的%去掉,并把字符轉(zhuǎn)型為float類型。如何實(shí)現(xiàn)呢?代碼如下:
- b=np.array(['0.01%','1.1%','1.21%'])
- newb=np.char.rstrip(b,'%').astype(float)
- print(newb)
輸出
- [0.01 1.1 1.21]
其中:
rstrip表示刪除某個(gè)字符
astype(float)表示把元素轉(zhuǎn)型為float