ndarray
:一種高效多維數(shù)組。-
一個(gè)例子比較NumPy數(shù)組和Python列表:
image.png -
NumPy核心特征之一就是N-維數(shù)組對(duì)象
ndarray
卢鹦,可以通過(guò)類似Python內(nèi)建對(duì)象的標(biāo)量計(jì)算語(yǔ)法進(jìn)行批量計(jì)算悄泥。如下:
image.png 一個(gè)
ndarray
是一個(gè)通用的多維同類數(shù)據(jù)容器虏冻,它里面的每一個(gè)元素都為相同類型,每個(gè)數(shù)組都有一個(gè)shape
屬性弹囚,用來(lái)表征數(shù)組每一維的數(shù)量(data.shape
)厨相,每個(gè)數(shù)組都有一個(gè)dtype
屬性,用來(lái)描述數(shù)組的數(shù)據(jù)類型(data.dtype
)鸥鹉。-
生成ndarray
-
array
函數(shù)蛮穿,接受任意的序列型對(duì)象,例如:
image.png嵌套序列毁渗,例如等長(zhǎng)的列表践磅,將會(huì)自動(dòng)轉(zhuǎn)換為多維數(shù)組。例如:
image.png -
zeros
函數(shù)灸异,生成全0數(shù)組府适。
image.png empty
函數(shù),生成未初始化值的數(shù)組肺樟。arange
函數(shù)檐春,等于Python中range
的數(shù)組版。
其他生成數(shù)組函數(shù)請(qǐng)見(jiàn)書(shū)P91.
-
-
ndarray數(shù)據(jù)類型
創(chuàng)建數(shù)組的時(shí)候指定數(shù)據(jù)類型:
arr1 = np.array([1,2,3]),dtype = np.float64)
arr2 = np.array([1,2,3]),dtype = np.int32)
astype
方法顯示地轉(zhuǎn)換數(shù)據(jù)類型:
arr.astype(float64)
可以傳入另一個(gè)數(shù)組的dtype屬性么伯,這樣將變成傳入數(shù)組的數(shù)據(jù)類型喇聊。
arr.astype(arr1)
NumPy數(shù)組算數(shù)
數(shù)組之所以重要是因?yàn)樗苓M(jìn)行批量操作而不需要for循環(huán),這種特性稱為向量化蹦狂。
可以做+
,-
,*
,/
,>
,<
,**
等運(yùn)算誓篱。
注:同尺寸數(shù)組之間的比較朋贬,會(huì)產(chǎn)生一個(gè)布爾值數(shù)組。-
基礎(chǔ)索引與切片操作
-
一維數(shù)組比較簡(jiǎn)單窜骄,與Python列表類似锦募。
需要注意的是,區(qū)別于Python列表邻遏,數(shù)組的切片是原數(shù)組的試圖糠亩,就是把原數(shù)組的一部分展示出來(lái),而不是復(fù)制新建另一個(gè)新數(shù)組准验。例子如下:當(dāng)我改變切片后的數(shù)組后赎线,變化也會(huì)體現(xiàn)在原數(shù)組上。
image.png - 如果你還是想要復(fù)制一份數(shù)組的切片的化糊饱,就需要顯式的復(fù)制這個(gè)數(shù)組垂寥,例如
arr[5:8].copy()
。
-
數(shù)組的切片索引
arr[1:6]
:第二個(gè)到第七個(gè)元素另锋。
arr[:2,1:]
:前兩行的第二列到最后一列的元素滞项。-
布爾索引
考慮下列例子:
image.png
假設(shè)每個(gè)人名都和data數(shù)組中的一行相對(duì)應(yīng),并且我們要選中所有Bob對(duì)應(yīng)的行夭坪,與數(shù)學(xué)操作類似文判,數(shù)組的比較操作也是可以向量化的。將names數(shù)組與字符串Bob比較將會(huì)產(chǎn)生一個(gè)布爾值數(shù)組室梅。
image.png
在索引數(shù)組時(shí)可以將布爾值數(shù)組傳入:
使用布爾值索引數(shù)組時(shí)戏仓,總是生成數(shù)據(jù)的拷貝,即使返回的數(shù)組并沒(méi)有任何改變亡鼠。
利用基于常識(shí)設(shè)置布爾值也是可行的柜去,例如
data[data < 0] = 0
。
-
神奇索引
神奇索引是NumPy中的術(shù)語(yǔ)拆宛,用于描述使用整數(shù)數(shù)組進(jìn)行索引嗓奢。假設(shè)我們有一個(gè)8*4的數(shù)組:
image.png
可以將位置序列傳入進(jìn)行索引:
image.png
神奇索引與切片不同,它總是將數(shù)據(jù)復(fù)制到一個(gè)新的數(shù)組中浑厚。
-
數(shù)組轉(zhuǎn)置和換軸
image.png
當(dāng)你需要進(jìn)行矩陣計(jì)算時(shí)股耽,可能會(huì)用到轉(zhuǎn)置矩陣。例如钳幅,計(jì)算矩陣內(nèi)積:
image.png另外兩個(gè)關(guān)于換軸操作的函數(shù):
transpose
,swapaxes
物蝙。
-
通用函數(shù):快速的逐元素?cái)?shù)組函數(shù)
是一種在ndarray數(shù)據(jù)中進(jìn)行逐元素操作的函數(shù),例如sqrt
或exp
函數(shù)敢艰。
image.png
上述函數(shù)稱為一元通用函數(shù)诬乞,只需要傳入一個(gè)數(shù)組,還有一些二元通用函數(shù),例如add
或maximum
震嫉。
np.add(arr1,arr2)
森瘪,將兩個(gè)數(shù)組相加。通用函數(shù)表見(jiàn)書(shū)P107票堵。
-
將條件邏輯作為數(shù)組操作
假設(shè)我們有兩個(gè)數(shù)值數(shù)組和一個(gè)布爾值數(shù)組:
image.png
現(xiàn)在我們進(jìn)行如下操作:假設(shè)cond中的元素為True時(shí)扼睬,我們?nèi)arr中對(duì)應(yīng)的元素,否則取yarr中對(duì)應(yīng)的元素悴势,通過(guò)列表推導(dǎo)式完成如下:
result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
image.png
上述實(shí)現(xiàn)會(huì)產(chǎn)生很多問(wèn)題窗宇,如果數(shù)組很大的話,速度會(huì)很慢特纤,因?yàn)樗械墓ぷ鞫际峭ㄟ^(guò)解釋器解釋Python代碼完成军俊。其次,當(dāng)數(shù)組是多維時(shí)捧存,就無(wú)法湊效了粪躬,所以我們應(yīng)使用np.where
方法。
result = np.where(cond,xarr,yarr)
np.where
方法第二個(gè)和第三個(gè)參數(shù)不一定非得是數(shù)組矗蕊,任何標(biāo)量都可以短蜕。-
一個(gè)常用場(chǎng)景氢架,根據(jù)一個(gè)數(shù)組來(lái)生成一個(gè)新的數(shù)組傻咖,假設(shè)你有一個(gè)隨機(jī)生成的矩陣數(shù)據(jù),并且你想將其中的正值都替換為2岖研,負(fù)值都替換為-2卿操,使用
np.where
實(shí)現(xiàn)如下:
image.png -
又或是標(biāo)量和數(shù)組聯(lián)合:
image.png
-
數(shù)學(xué)和統(tǒng)計(jì)學(xué)方法
- 用來(lái)求數(shù)組的最大值,最小值孙援,平均值等統(tǒng)計(jì)值害淤。
- 一些統(tǒng)計(jì)方法函數(shù),見(jiàn)書(shū)P113拓售。
布爾值數(shù)組的方法
any
:檢查數(shù)組中是否至少有一個(gè)True窥摄。
all
:檢查數(shù)組中是否全為False。唯一值與其他集合邏輯
np.unique
:NumPy包含一些針對(duì)一維數(shù)組的基礎(chǔ)操作础淤,常用的一個(gè)方法是np.unique
崭放,返回的數(shù)組中唯一值排序后形成的數(shù)組。(類似集合)
np.in1d
:檢查一個(gè)數(shù)組的值是否在另一個(gè)數(shù)組中,并返回一個(gè)布爾值數(shù)組鸽凶。
另一些其他方法見(jiàn)書(shū)P115币砂。-
使用數(shù)組進(jìn)行文件輸入和輸出
- Numpy可以在硬盤中將數(shù)據(jù)以文本或二進(jìn)制文件的形式進(jìn)行存入硬盤或從硬盤中載入。
-
np.save
和np.load
是高效存取硬盤數(shù)據(jù)的兩大工具玻侥,后綴名是.npy
决摧。
線性代數(shù)
常用的線性代數(shù)運(yùn)算見(jiàn)書(shū)P118。-
偽隨機(jī)數(shù)生成
numpy.random
模塊填補(bǔ)了Python內(nèi)建的random
模塊的不足,可以高效的生成多種概率分布下的完整樣本值數(shù)組掌桩。例如你可以用normal
來(lái)獲得一個(gè)4x4的正態(tài)分布樣本數(shù)組:
image.png
一些其他random
函數(shù)見(jiàn)書(shū)P119边锁。