Numpy學(xué)習(xí)筆記

根據(jù)《利用python進(jìn)行數(shù)據(jù)分析》和原博文http://www.itdecent.cn/p/a380222a3292個(gè)人使用學(xué)習(xí)筆記

Numpy基礎(chǔ):數(shù)組和矢量計(jì)算

Numpy的ndarray:一種多維數(shù)組對(duì)象

  • 特點(diǎn):快速靈活,同種類型

  • 屬性:ndim, shape(維度),dtype(數(shù)據(jù)類型)

創(chuàng)建ndarray

  • array函數(shù):接受一切序列型對(duì)象(包括其他數(shù)組)產(chǎn)生一個(gè)NumPy數(shù)組
img

數(shù)據(jù)類型

  • 常用類型
img

img
  • astype轉(zhuǎn)換類型
In [38]: arr.dtype
Out[38]: dtype('int64')
?
In [39]: float_arr = arr.astype(np.float64)
?
In [40]: float_arr.dtype
Out[40]: dtype('float64')
# 字符串    
In [44]: numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
?
In [45]: numeric_strings.astype(float)
Out[45]: array([  1.25,  -9.6 ,  42.  ])</pre>

調(diào)用astype總會(huì)創(chuàng)建一個(gè)新的數(shù)組(一個(gè)數(shù)據(jù)的備份),即使新的dtype與舊的dtype相同

Numpy數(shù)組的運(yùn)算

數(shù)組使不用編寫循環(huán)即可對(duì)數(shù)據(jù)執(zhí)行批量運(yùn)算,NumPy用戶稱其為矢量化(vectorization)。大小相等的數(shù)組之間的任何算術(shù)運(yùn)算都會(huì)將運(yùn)算應(yīng)用到元素級(jí)(類似R),不同大小的數(shù)組之間的運(yùn)算叫做廣播(broadcasting)

索引

切片索引

當(dāng)你將一個(gè)標(biāo)量值賦值給一個(gè)切片時(shí)(如arr[5:8]=12),該值會(huì)自動(dòng)傳播(也就說(shuō)后面將會(huì)講到的“廣播”)到整個(gè)選區(qū)。

跟列表最重要的區(qū)別在于,數(shù)組切片是原始數(shù)組的視圖。這意味著數(shù)據(jù)不會(huì)被復(fù)制,視圖上的任何修改都會(huì)直接反映到源數(shù)組上。

如果你想要得到的是ndarray切片的一份副本而非視圖,就需要明確地進(jìn)行復(fù)制操作,例如arr[5:8].copy()。

In [74]: arr2d[0][2]
Out[74]: 3
# 等價(jià)
In [75]: arr2d[0, 2]
Out[75]: 3

布爾值索引

In [102]: names == 'Bob'
Out[102]: array([ True, False, False,  True, False, False, False], dtype=bool)
In [103]: data[names == 'Bob']
Out[103]: 
array([[ 0.0929,  0.2817,  0.769 ,  1.2464],
 [ 1.669 , -0.4386, -0.5397,  0.477 ]])

數(shù)組的比較運(yùn)算(如==)是矢量化的。對(duì)names和字符串"Bob"的比較運(yùn)算將會(huì)產(chǎn)生一個(gè)布爾型數(shù)組,可以用于數(shù)組索引,布爾型數(shù)組的長(zhǎng)度必須跟被索引的軸長(zhǎng)度一致

~反轉(zhuǎn)條件,!=不等于也很常用,Python關(guān)鍵字and和or在布爾型數(shù)組中無(wú)效,要使用&與|

通過(guò)布爾型索引選取數(shù)組中的數(shù)據(jù),將總是創(chuàng)建數(shù)據(jù)的副本

花式索引

In [119]: arr
Out[119]: 
array([[ 0.,  0.,  0.,  0.],
 [ 1.,  1.,  1.,  1.],
 [ 2.,  2.,  2.,  2.],
 [ 3.,  3.,  3.,  3.],
 [ 4.,  4.,  4.,  4.],
 [ 5.,  5.,  5.,  5.],
 [ 6.,  6.,  6.,  6.],
 [ 7.,  7.,  7.,  7.]])
In [120]: arr[[4, 3, 0, 6]]
Out[120]: 
array([[ 4.,  4.,  4.,  4.],
 [ 3.,  3.,  3.,  3.],
 [ 0.,  0.,  0.,  0.],
 [ 6.,  6.,  6.,  6.]])
In [124]: arr[[1, 5, 7, 2], [0, 3, 1, 2]]
Out[124]: array([ 4, 23, 29, 10])

花式索引跟切片不一樣,總是將數(shù)據(jù)復(fù)制到新數(shù)組中

轉(zhuǎn)置.T

通用函數(shù)ufunc

通用函數(shù)(即ufunc)是一種對(duì)ndarray中的數(shù)據(jù)執(zhí)行元素級(jí)運(yùn)算的函數(shù)。有些ufunc可以返回多個(gè)數(shù)組

img
img
img

數(shù)組進(jìn)行數(shù)據(jù)處理

NumPy數(shù)組使你可以將許多種數(shù)據(jù)處理任務(wù)表述為簡(jiǎn)潔的數(shù)組表達(dá)式(否則需要編寫循環(huán))。用數(shù)組表達(dá)式代替循環(huán)的做法,通常被稱為矢量化。一般來(lái)說(shuō),矢量化數(shù)組運(yùn)算要比等價(jià)的純Python方式快上一兩個(gè)數(shù)量級(jí)(甚至更多),尤其是各種數(shù)值計(jì)算。

條件邏輯

numpy.where函數(shù)是三元表達(dá)式x if condition else y的矢量化版本

In [170]: result = np.where(cond, xarr, yarr)
?
In [175]: np.where(arr > 0, 2, -2)
Out[175]: 
array([[-2, -2, -2, -2],
 [ 2,  2, -2,  2],
 [ 2,  2,  2, -2],
 [ 2, -2,  2,  2]])
In [176]: np.where(arr > 0, 2, arr) 
Out[176]: 
array([[-0.5031, -0.6223, -0.9212, -0.7262],
 [ 2.    ,  2.    , -1.1577,  2.    ],
 [ 2.    ,  2.    ,  2.    , -0.9975],
 [ 2.    , -0.1316,  2.    ,  2.    ]])

數(shù)學(xué)統(tǒng)計(jì)方法

img

img

布爾型數(shù)組方法

  • sum經(jīng)常被用來(lái)對(duì)布爾型數(shù)組中的True值計(jì)數(shù)

  • any用于測(cè)試數(shù)組中是否存在一個(gè)或多個(gè)True

  • all則檢查數(shù)組中所有值是否都是True

  • 所有非0元素將會(huì)被當(dāng)做True。

排序sort

In [199]: arr = np.random.randn(5, 3)
?
In [200]: arr
Out[200]: 
array([[ 0.6033,  1.2636, -0.2555],
 [-0.4457,  0.4684, -0.9616],
 [-1.8245,  0.6254,  1.0229],
 [ 1.1074,  0.0909, -0.3501],
 [ 0.218 , -0.8948, -1.7415]])
?
In [201]: arr.sort(1)
?
In [202]: arr
Out[202]: 
array([[-0.2555,  0.6033,  1.2636],
 [-0.9616, -0.4457,  0.4684],
 [-1.8245,  0.6254,  1.0229],
 [-0.3501,  0.0909,  1.1074],
 [-1.7415, -0.8948,  0.218 ]])

唯一化及其他的集合邏輯

  • np.unique用于找出數(shù)組中的唯一值并返回已排序的結(jié)果

  • np.in1d用于測(cè)試一個(gè)數(shù)組中的值在另一個(gè)數(shù)組中的成員資格,返回一個(gè)布爾型數(shù)組

In [208]: ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
In [209]: np.unique(ints)
Out[209]: array([1, 2, 3, 4])
# 普通代碼
In [210]: sorted(set(names))
Out[210]: ['Bob', 'Joe', 'Will']

In [211]: values = np.array([6, 0, 0, 3, 2, 5, 6])
In [212]: np.in1d(values, [2, 3, 6])
Out[212]: array([ True, False, False,  True,  True, False,  True], dtype=bool)
img

用于數(shù)組的文件輸入輸出

np.save和np.load是讀寫磁盤數(shù)組數(shù)據(jù)的兩個(gè)主要函數(shù)。默認(rèn)情況下,數(shù)組是以未壓縮的原始二進(jìn)制格式保存在擴(kuò)展名為.npy的文件中的。

通過(guò)np.savez可以將多個(gè)數(shù)組保存到一個(gè)未壓縮文件中,將數(shù)組以關(guān)鍵字參數(shù)的形式傳入即可

In [213]: arr = np.arange(10)
In [214]: np.save('some_array', arr)

In [215]: np.load('some_array.npy')
Out[215]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])</pre>

線性代數(shù)numpy.linalg

x.dot(y)等價(jià)于np.dot(x, y)

numpy.linalg中有一組標(biāo)準(zhǔn)的矩陣分解運(yùn)算以及諸如求逆和行列式之類的東西

img

偽隨機(jī)數(shù)生成numpy.random

numpy.random模塊對(duì)Python內(nèi)置的random進(jìn)行了補(bǔ)充,增加了一些用于高效生成多種概率分布的樣本值的函數(shù)。

用NumPy的np.random.seed更改隨機(jī)數(shù)生成種子

img
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容