深入理解NumPy簡(jiǎn)明教程---數(shù)組1
目前我的工作是將NumPy引入到Pyston中(一款Dropbox實(shí)現(xiàn)的Python編譯器/解釋器)。在工作過(guò)程中,我深入接觸了NumPy源碼,了解其實(shí)現(xiàn)并提交了PR修復(fù)NumPy的bug。在與NumPy源碼以及NumPy開(kāi)發(fā)者打交道的過(guò)程中,我發(fā)現(xiàn)當(dāng)今中文NumPy教程大部分都是翻譯或參考英文文檔,因此導(dǎo)致了許多疏漏。比如NumPy數(shù)組中的broadcast功能,幾乎所有中文文檔都翻譯為“廣播”。而NumPy的開(kāi)發(fā)者之一,回復(fù)到“broadcast is a compound -- native English speakers can see that it's " broad" + "cast" = "cast (scatter, distribute) broadly, I guess "cast (scatter, distribute) broadly" probably is closer to the meaning(NumPy中的含義)"。有鑒于此,我打算啟動(dòng)一個(gè)項(xiàng)目,以我對(duì)NumPy使用以及源碼層面的了解編寫(xiě)一個(gè)系列的教程。
NumPy數(shù)組
NumPy數(shù)組是一個(gè)多維數(shù)組對(duì)象,稱(chēng)為ndarray。其由兩部分組成:
- 實(shí)際的數(shù)據(jù)
- 描述這些數(shù)據(jù)的元數(shù)據(jù)
大部分操作僅針對(duì)于元數(shù)據(jù),而不改變底層實(shí)際的數(shù)據(jù)。
關(guān)于NumPy數(shù)組有幾點(diǎn)必需了解的:
- NumPy數(shù)組的下標(biāo)從0開(kāi)始。
- 同一個(gè)NumPy數(shù)組中所有元素的類(lèi)型必須是相同的。
NumPy數(shù)組屬性
在詳細(xì)介紹NumPy數(shù)組之前。先詳細(xì)介紹下NumPy數(shù)組的基本屬性。NumPy數(shù)組的維數(shù)稱(chēng)為秩(rank),一維數(shù)組的秩為1,二維數(shù)組的秩為2,以此類(lèi)推。在NumPy中,每一個(gè)線(xiàn)性的數(shù)組稱(chēng)為是一個(gè)軸(axes),秩其實(shí)是描述軸的數(shù)量。比如說(shuō),二維數(shù)組相當(dāng)于是兩個(gè)一維數(shù)組,其中第一個(gè)一維數(shù)組中每個(gè)元素又是一個(gè)一維數(shù)組。所以一維數(shù)組就是NumPy中的軸(axes),第一個(gè)軸相當(dāng)于是底層數(shù)組,第二個(gè)軸是底層數(shù)組里的數(shù)組。而軸的數(shù)量——秩,就是數(shù)組的維數(shù)。
NumPy的數(shù)組中比較重要ndarray對(duì)象屬性有:
- ndarray.ndim:數(shù)組的維數(shù)(即數(shù)組軸的個(gè)數(shù)),等于秩。最常見(jiàn)的為二維數(shù)組(矩陣)。
- ndarray.shape:數(shù)組的維度。為一個(gè)表示數(shù)組在每個(gè)維度上大小的整數(shù)元組。例如二維數(shù)組中,表示數(shù)組的“行數(shù)”和“列數(shù)”。ndarray.shape返回一個(gè)元組,這個(gè)元組的長(zhǎng)度就是維度的數(shù)目,即ndim屬性。
- ndarray.size:數(shù)組元素的總個(gè)數(shù),等于shape屬性中元組元素的乘積。
- ndarray.dtype:表示數(shù)組中元素類(lèi)型的對(duì)象,可使用標(biāo)準(zhǔn)的Python類(lèi)型創(chuàng)建或指定dtype。另外也可使用前一篇文章中介紹的NumPy提供的數(shù)據(jù)類(lèi)型。
- ndarray.itemsize:數(shù)組中每個(gè)元素的字節(jié)大小。例如,一個(gè)元素類(lèi)型為float64的數(shù)組itemsiz屬性值為8(float64占用64個(gè)bits,每個(gè)字節(jié)長(zhǎng)度為8,所以64/8,占用8個(gè)字節(jié)),又如,一個(gè)元素類(lèi)型為complex32的數(shù)組item屬性為4(32/8)。
- ndarray.data:包含實(shí)際數(shù)組元素的緩沖區(qū),由于一般通過(guò)數(shù)組的索引獲取元素,所以通常不需要使用這個(gè)屬性。
創(chuàng)建數(shù)組
先來(lái)介紹創(chuàng)建數(shù)組。創(chuàng)建數(shù)組的方法有很多。如可以使用array函數(shù)從常規(guī)的Python列表和元組創(chuàng)造數(shù)組。所創(chuàng)建的數(shù)組類(lèi)型由原序列中的元素類(lèi)型推導(dǎo)而來(lái)?! ?nbsp;
>>> from numpy import * >>> a = array( [2,3,4] ) >>> a array([2, 3, 4]) >>> a.dtype dtype('int32') >>> b = array([1.2, 3.5, 5.1]) >>> b.dtype dtype('float64')
使用array函數(shù)創(chuàng)建時(shí),參數(shù)必須是由方括號(hào)括起來(lái)的列表,而不能使用多個(gè)數(shù)值作為參數(shù)調(diào)用array?! ?/p>
>>> a = array(1,2,3,4) # 錯(cuò)誤 >>> a = array([1,2,3,4]) # 正確
可使用雙重序列來(lái)表示二維的數(shù)組,三重序列表示三維數(shù)組,以此類(lèi)推。
>>> b = array( [ (1.5,2,3), (4,5,6) ] ) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])
可以在創(chuàng)建時(shí)顯式指定數(shù)組中元素的類(lèi)型
>>> c = array( [ [1,2], [3,4] ], dtype=complex) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]])
通常,剛開(kāi)始時(shí)數(shù)組的元素未知,而數(shù)組的大小已知。因此,NumPy提供了一些使用占位符創(chuàng)建數(shù)組的函數(shù)。這些函數(shù)有助于滿(mǎn)足除了數(shù)組擴(kuò)展的需要,同時(shí)降低了高昂的運(yùn)算開(kāi)銷(xiāo)。
用函數(shù)zeros可創(chuàng)建一個(gè)全是0的數(shù)組,用函數(shù)ones可創(chuàng)建一個(gè)全為1的數(shù)組,函數(shù)empty創(chuàng)建一個(gè)內(nèi)容隨機(jī)并且依賴(lài)與內(nèi)存狀態(tài)的數(shù)組。默認(rèn)創(chuàng)建的數(shù)組類(lèi)型(dtype)都是float64。
可以喲娜特d.dtype.itemsize來(lái)查看數(shù)組中元素占用的字節(jié)數(shù)目。
>>> d = zeros((3,4)) >>> d.dtype dtype('float64') >>> d array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) >>> d.dtype.itemsize 8
也可以自己制定數(shù)組中元素的類(lèi)型
>>> ones( (2,3,4), dtype=int16 ) #手動(dòng)指定數(shù)組中元素類(lèi)型 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) >>> empty((2,3)) array([[ 2.65565858e-316, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000]])
NumPy提供一個(gè)類(lèi)似arange的函數(shù)返回一個(gè)數(shù)列形式的數(shù)組:
>>> arange(10, 30, 5) array([10, 15, 20, 25])
以10開(kāi)始,差值為5的等差數(shù)列。該函數(shù)不僅接受整數(shù),還接受浮點(diǎn)參數(shù):
>>> arange(0,2,0.5) array([ 0. , 0.5, 1. , 1.5])
當(dāng)arange使用浮點(diǎn)數(shù)參數(shù)時(shí),由于浮點(diǎn)數(shù)精度有限,通常無(wú)法預(yù)測(cè)獲得的元素個(gè)數(shù)。因此,最好使用函數(shù)linspace去接收我們想要的元素個(gè)數(shù)來(lái)代替用range來(lái)指定步長(zhǎng)。linespace用法如下,將在通用函數(shù)一節(jié)中詳細(xì)介紹。
>>> numpy.linspace(-1, 0, 5) array([-1. , -0.75, -0.5 , -0.25, 0. ])
數(shù)組中的元素是通過(guò)下標(biāo)來(lái)訪(fǎng)問(wèn)的,可以通過(guò)方括號(hào)括起一個(gè)下標(biāo)來(lái)訪(fǎng)問(wèn)數(shù)組中單一一個(gè)元素,也可以以切片的形式訪(fǎng)問(wèn)數(shù)組中多個(gè)元素。關(guān)于切片訪(fǎng)問(wèn),將在切片一節(jié)介紹。
知識(shí)點(diǎn):NumPy中的數(shù)據(jù)類(lèi)型
對(duì)于科學(xué)計(jì)算來(lái)說(shuō),Python中自帶的整型、浮點(diǎn)型和復(fù)數(shù)類(lèi)型遠(yuǎn)遠(yuǎn)不夠,因此NumPy中添加了許多數(shù)據(jù)類(lèi)型。如下:
NumPy中的基本數(shù)據(jù)類(lèi)型
名稱(chēng) | 描述 |
bool | 用一個(gè)字節(jié)存儲(chǔ)的布爾類(lèi)型(True或False) |
inti | 由所在平臺(tái)決定其大小的整數(shù)(一般為int32或int64) |
int8 | 一個(gè)字節(jié)大小,-128 至 127 |
int16 | 整數(shù),-32768 至 32767 |
int32 | 整數(shù),-2 ** 31 至 2 ** 32 -1 |
int64 | 整數(shù),-2 ** 63 至 2 ** 63 - 1 |
uint8 | 無(wú)符號(hào)整數(shù),0 至 255 |
uint16 | 無(wú)符號(hào)整數(shù),0 至 65535 |
uint32 | 無(wú)符號(hào)整數(shù),0 至 2 ** 32 - 1 |
uint64 | 無(wú)符號(hào)整數(shù),0 至 2 ** 64 - 1 |
float16 | 半精度浮點(diǎn)數(shù):16位,正負(fù)號(hào)1位,指數(shù)5位,精度10位 |
float32 | 單精度浮點(diǎn)數(shù):32位,正負(fù)號(hào)1位,指數(shù)8位,精度23位 |
float64或float | 雙精度浮點(diǎn)數(shù):64位,正負(fù)號(hào)1位,指數(shù)11位,精度52位 |
complex64 | 復(fù)數(shù),分別用兩個(gè)32位浮點(diǎn)數(shù)表示實(shí)部和虛部 |
complex128或complex | 復(fù)數(shù),分別用兩個(gè)64位浮點(diǎn)數(shù)表示實(shí)部和虛部 |
NumPy類(lèi)型轉(zhuǎn)換方式如下:
>>> float64(42) 42.0 >>> int8(42.0) 42 >>> bool(42) True >>> bool(42.0) True >>> float(True) 1.0
許多函數(shù)的參數(shù)中可以指定參數(shù)的類(lèi)型,當(dāng)然,這個(gè)類(lèi)型參數(shù)是可選的。如下:
>>> arange(7, dtype=uint16) array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)
輸出數(shù)組
當(dāng)輸出一個(gè)數(shù)組時(shí),NumPy以特定的布局用類(lèi)似嵌套列表的形式顯示:
- 第一行從左到右輸出
- 每行依次自上而下輸出
- 每個(gè)切片通過(guò)一個(gè)空行與下一個(gè)隔開(kāi)
- 一維數(shù)組被打印成行,二維數(shù)組成矩陣,三維數(shù)組成矩陣列表?!?/li>
>>> a = arange(6) # 1d array >>> print a [0 1 2 3 4 5] >>> b = arange(12).reshape(4,3) # 2d array >>> print b [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] >>> c = arange(24).reshape(2,3,4) # 3d array >>> print c [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
reshape將在下一篇文章中介紹
如果一個(gè)數(shù)組太長(zhǎng),則NumPy自動(dòng)省略中間部分而只打印兩端的數(shù)據(jù):
>>> print arange(10000) [ 0 1 2 ..., 9997 9998 9999] >>> print arange(10000).reshape(100,100) [[ 0 1 2 ..., 97 98 99] [ 100 101 102 ..., 197 198 199] [ 200 201 202 ..., 297 298 299] ..., [9700 9701 9702 ..., 9797 9798 9799] [9800 9801 9802 ..., 9897 9898 9899] [9900 9901 9902 ..., 9997 9998 9999]]
可通過(guò)設(shè)置printoptions參數(shù)來(lái)禁用NumPy的這種行為并強(qiáng)制打印整個(gè)數(shù)組。
set_printoptions(threshold='nan')
這樣,輸出時(shí)數(shù)組的所有元素都會(huì)顯示出來(lái)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python統(tǒng)計(jì)多維數(shù)組的行數(shù)和列數(shù)實(shí)例
今天小編就為大家分享一篇python統(tǒng)計(jì)多維數(shù)組的行數(shù)和列數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06解決PyCharm同目錄下導(dǎo)入模塊會(huì)報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決PyCharm同目錄下導(dǎo)入模塊會(huì)報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10python+OpenCV人臉識(shí)別考勤系統(tǒng)實(shí)現(xiàn)的詳細(xì)代碼
作為一個(gè)基于人臉識(shí)別算法的考勤系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)教程,以下內(nèi)容將提供詳細(xì)的步驟和代碼示例。本教程將使用 Python 語(yǔ)言和 OpenCV 庫(kù)進(jìn)行實(shí)現(xiàn),需要的朋友可以參考下2023-05-05基于Python+Appium實(shí)現(xiàn)京東雙十一自動(dòng)領(lǐng)金幣功能
一年一度的雙十一即將來(lái)臨,各大平臺(tái)都在搞活動(dòng),京東天貓忙的不易樂(lè)乎,做任務(wù)領(lǐng)金幣的過(guò)程真的好無(wú)聊,今天小編給大家分享一篇教程通關(guān)Python+Appium實(shí)現(xiàn)京東雙十一自動(dòng)領(lǐng)金幣功能,需要的朋友可以參考下2019-10-10Python利用3D引擎做一個(gè)太陽(yáng)系行星模擬器
Python有一個(gè)不錯(cuò)的3D引擎——Ursina。本文就來(lái)利用Ursina這一3D引擎做一個(gè)太陽(yáng)系行星模擬器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01Python+tkinter實(shí)現(xiàn)樹(shù)形圖繪制
Treeview是ttk中的樹(shù)形表組件,功能十分強(qiáng)大,非常適用于系統(tǒng)路徑的表達(dá),下面我們就來(lái)看看如何利用這一組件實(shí)現(xiàn)樹(shù)形圖的繪制吧,有需要的可以參考下2023-09-09Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼
這篇文章主要介紹了Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02python查詢(xún)mysql,返回json的實(shí)例
下面小編就為大家分享一篇python查詢(xún)mysql,返回json的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03