根據(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ù)組

數(shù)據(jù)類型
- 常用類型


- 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ù)組



數(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ì)方法


布爾型數(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)

用于數(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)算以及諸如求逆和行列式之類的東西

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