import numpy as np
一、數(shù)據(jù)類型簡介
Numerical Python:底層代碼為C,支持處理大量數(shù)據(jù)
所有 Numpy 數(shù)據(jù)類型都是 numpy.generic 的子類
支持向量運(yùn)算:N維數(shù)組對(duì)象,只允許存儲(chǔ)相同的數(shù)據(jù)類型
支持 float、int、bool、timedelta[ns]、datetime64[ns]等

注意:Numpy 不支持帶時(shí)區(qū)信息的 datetime
- 數(shù)據(jù)結(jié)構(gòu)的特性
多維數(shù)組np.array():向量、矩陣運(yùn)算
默認(rèn)行向量
axis = 0 表示跨行;
axis = 1 表示跨列;
支持的數(shù)據(jù)類型@圖-核心、創(chuàng)建、保存
實(shí)用的線性代數(shù)、傅里葉變換和隨機(jī)數(shù)生成函數(shù)
和稀疏矩陣運(yùn)算包scipy配合使用更加方便
二、具體操作
- 區(qū)分函數(shù)與方法 (以reshape為例)
| 目標(biāo)類型 | 說明 |
|---|---|
| 函數(shù) | 基于模塊 np.reshape(array, [index參數(shù)]) +傳遞實(shí)參 +不修改原始數(shù)據(jù)——>需要賦值,或者直接輸出 |
| 方法 | ndarray.reshape() +相當(dāng)于以array為對(duì)象進(jìn)行的操作/屬性 +更改原始數(shù)據(jù),相當(dāng)于inplace = True |
- 創(chuàng)建
默認(rèn)數(shù)據(jù)類型是'int64'或'float64'
初始化
np.array([], dtype = np.int64)
np.copy()淺復(fù)制(深復(fù)制用賦值=)初始化函數(shù)
np.zeros(shape)
np.empty(shape)每個(gè)值都接近于零
np.ones(shape)
np.full(shape, constant value)
np.eye(N)
np.diag([對(duì)角線元素列表])
np.arange(start,stop,step)左閉右開[start, stop) 類似pythonrange();允許間隔為非整數(shù),例如 0.3,但是由于浮點(diǎn)數(shù)精度有限, 建議np.linspace()
np.linspace(start, stop, N)隨機(jī)數(shù)模塊random
np.random.seed(0)
np.random.rand(shape)
np.random.random(shape)
np.random.randint(start, stop, size = shape)
np.random.uniform()均勻分布
np.random.normal(mean, standard deviation, size=shape)統(tǒng)計(jì)學(xué)特定分布特性
np.random.permutation(N)創(chuàng)建一個(gè)秩為 1 的 ndarray,其中包含隨機(jī)排列的行索引(用來隨機(jī)打亂數(shù)據(jù)集-N個(gè)元素的順序)
- 查/改/增/刪
屬性:數(shù)據(jù)類型
.dtype具體元素的類型
.dtype.name查看數(shù)據(jù)類型,name是.dtype的一個(gè)屬性
.astype(np.float64)轉(zhuǎn)換數(shù)據(jù)類型
注意:修改數(shù)據(jù)類型,只能用.astype查
- 數(shù)值型索引
- 布爾型索引
ndarray[np.where(邏輯判斷表達(dá)式)]
np.where(x>0,x,0)小于0的值用0填充,大于0的數(shù)不變,是三元表達(dá)式 x if condition else y 的矢量化版本
np.where(np.isnan(ndarray), 0, ndarray)
np.where(ndarray != 0)
np.argwhere(ndarray ==0)返回下標(biāo)
np.any()
np.all()
np.unique(ndarray)返回給定 ndarray 中的 唯一元素(去重后的元素)
np.in1d(ndarray, [查找目標(biāo)元素])類似in
np.nonzero()非零檢測,第一個(gè)array表示行坐標(biāo),第二個(gè)array表示列坐標(biāo)- 切片
左閉右開,提取某行/列
將數(shù)據(jù)集拆分為訓(xùn)練集、交叉驗(yàn)證集和測試集
ndarray[start : end]
ndarray[start : ]
ndarray[: end]
注意:Z = X[1:4,2:5] 對(duì) Z 做出更改,也會(huì)更改原始數(shù)據(jù)X中相應(yīng)的元素
改
- 索引修改
np.clip(A,5,9) 設(shè)定上下限,在5-9之間,保持原始數(shù)據(jù)不變,小于5,則為5;大于9則為9
ndarray.flatten() 多維變?yōu)橐痪S
- 數(shù)組轉(zhuǎn)置為矩陣
A[np.newaxis,:](3,)變?yōu)?1, 3)
A[:,np.newaxis]- 合并
np.vstack((ndarray1, ndarray2))上下-垂直堆疊
np.hstack((ndarray1, ndarray2))水平堆疊
np.meshgrid()接受兩個(gè)一維數(shù)組并產(chǎn)生二維矩陣
np.concatenate(axis=)多個(gè)矩陣合并- 分割
.reshape()
- 均勻分割
np.split(axis=0)默認(rèn)水平線分割(跨行)
np.vsplit()橫向分割,等價(jià)于np.split(axis=0)
np.hsplit()默認(rèn)垂直線分割(跨列),等價(jià)于np.split(axis=1),指定要返回的相同shape的array的數(shù)量,或者通過指定分割應(yīng)該發(fā)生之后的列來沿著其橫軸拆分原array- 不均勻分割
np.array_split()默認(rèn)縱向(axis=0 跨行)增
np.append(ndarray, elements, axis)
np.insert(ndarray, index, elements, axis)刪
np.delete(ndarray, elements, axis)
- 排序/遍歷/統(tǒng)計(jì)
排序
np.sort(ndarray, axis= )當(dāng)做函數(shù)使用時(shí),它不會(huì)對(duì)ndarray進(jìn)行就地排序遍歷
np.diag(ndarray, k=N)k=0,表示主對(duì)角線(對(duì)角線元素提取)
for … in統(tǒng)計(jì)
.shape維度
.size元素個(gè)數(shù)
len(x)輸出的矩陣長度,也就是所謂的行數(shù)
.ndim可以輸出矩陣維數(shù),即列數(shù)
np.bincount(ndarray)統(tǒng)計(jì)索引出現(xiàn)次數(shù) 下標(biāo)0、1、2等出現(xiàn)的次數(shù)
np.bincount(ndarray, weights=[])權(quán)重列表的元素個(gè)數(shù)與ndarray對(duì)應(yīng),相加不必為1:即在次數(shù)結(jié)果的基礎(chǔ)上,疊加權(quán)重的影響
np.bincount(ndarray,weights=[], minlength=)當(dāng)minlength的數(shù)量多于ndarray元素的數(shù)量,后面沒訪問到的設(shè)置為0
應(yīng)用:np.argmax(np.bincount(ndarray))表示出現(xiàn)次數(shù)最多的元素的下標(biāo)/索引數(shù)值
三、特性:數(shù)學(xué)計(jì)算
- 元素
np.add(x,y)
np.subtract(x,y)
np.multiply(x,y)
np.divide(x,y)
np.abs()
np.square()
np.maximum()
np.exp(x)
np.sin()
np.sqrt(x)
np.power(x,2)
np.greater(x, y)比較返回布爾值
注意:log函數(shù)
np.log(x, y)以x為底
np.log()以e為底
log10()以10為底
- 矩陣
注意維度的區(qū)分:N維數(shù)組,有N層中括號(hào)[]
ndarray矩陣相乘的本質(zhì)(底層邏輯)
- 實(shí)例:
np.dot((2, 1), (2, ))報(bào)錯(cuò)(雖然第二個(gè)默認(rèn)行向量,但終究不是1*2的行向量)
(2, 1): [[1], [2]]
(2, ): [3, 4]
(1, 2): [[3, 4]]正確的運(yùn)算應(yīng)該是:
np.dot((2, 1), (1, 2))
- 先去掉外層的[]:[1], [2] 與 [3, 4]
- 針對(duì)內(nèi)層的[]:1和3, 4生成[3, 4]
- 最后生成
維度(2, 2)的矩陣
注意:
np.dot((2, ), (2, 1)) == (1, )默認(rèn)行向量補(bǔ)充:
data[:, None]
本意:對(duì)一維數(shù)組來說,轉(zhuǎn)置還是行向量(Numpy默認(rèn)一維數(shù)組為行向量),所以可以用 arr[:,None] 來創(chuàng)建一個(gè)列向量(本質(zhì)上是二維數(shù)組)
- 當(dāng)data是
一維數(shù)組(n,),相當(dāng)于轉(zhuǎn)置(行、列向量的轉(zhuǎn)換)
構(gòu)造新的列:一維數(shù)據(jù)變?yōu)槎S- 當(dāng)data是
矩陣(1, n)時(shí),data[:, None]生成(1,1,n)
神經(jīng)網(wǎng)絡(luò)反向傳播的啟發(fā)
默認(rèn)行向量,可用
.flatten()或.ravel()轉(zhuǎn)化為一維數(shù)組(默認(rèn)行向量)
- Hadamard乘積(對(duì)應(yīng)元素相乘)
np.multiply()
*乘法
一維數(shù)組對(duì)應(yīng)元素相乘(2, )*(2, )=(2, )
矩陣相乘
一維數(shù)組內(nèi)積np.dot((2, )(2, )) ==(1, )
一維數(shù)組相乘:列*行得到矩陣@權(quán)重的更新,用.reshape()
np.dot()各種情況匯總(主要針對(duì)一維數(shù)組,二維數(shù)組-行向量/列向量)
(1, n) & (n, ) == (1, )生成一維數(shù)組
(n, ) & (n, 3) == (3, ): (n, 3)&(n, )報(bào)錯(cuò)
(1, n) & (n, 1) == (1, 1)生成列向量(二維數(shù)組)特殊情況:
*乘法廣播展開(尾部維度一致)
(6, ) * (6, 1) == (6, 6)(尾部維度為(6))
(6, 1) * (6, ) == (6, 6)(尾部維度為(1))神經(jīng)網(wǎng)絡(luò)中的應(yīng)用:針對(duì)反向傳播
- 利用轉(zhuǎn)置-調(diào)換位置計(jì)算反向誤差
反向誤差error- 權(quán)重更新:列*行生成權(quán)重矩陣
當(dāng)x, y均為一維數(shù)組時(shí),下列兩種方法等價(jià)
x[:, None] * y
y * x[:, None]
權(quán)重更新矩陣
轉(zhuǎn)置
ndarray.T
ndarray.transpose()
.swapaxes()接受一對(duì)軸變換
.reshape()矩陣相乘
np.dot(a, b)等價(jià)于a.dot(b)如果a b都是一維的,表示內(nèi)積;如果是二維以上,則為矩陣相乘
np.matmul(a, b)矩陣乘積
注意:當(dāng)a或b其中一個(gè)是標(biāo)量的時(shí)候,只能用np.dot,或*,等價(jià)于元素乘法np.multiply
補(bǔ)充:
- 如果a是N維數(shù)組, b是1維數(shù)組,如(3,3,3)與(3,)矩陣相乘的結(jié)果是(3,3)
- 如果a是N維數(shù)組, b是M維數(shù)組(M>2)
維度變化 多維數(shù)組相乘
-
特性:廣播
1 標(biāo)量和 ndarray 之間
2 兩個(gè)形狀不同的 ndarray之間:形狀相適應(yīng)(尾部維度必須兼容)
本質(zhì):np.tile(ndarray, shape)按照shape重復(fù)ndarray元素
ndarray 廣播機(jī)制 特性:統(tǒng)計(jì)學(xué)函數(shù)(注意:參數(shù)
axis=)
X.mean()
np.average()
X.sum()
X.std()
np.corrcoef(ndarray)默認(rèn)皮爾森相關(guān)系數(shù),也可以用ranked correlation,也就是spearman correlation,可以直接用scipy.stats.spearmanr
np.median(X)
X.max()
X.min()
.argmin()
.argmax()
.cumsum() 累計(jì)和
.cumprod() 累計(jì)積
np.diff(x,axis=1) 默認(rèn)axis=1 后面元素減去前面元素
np.around(decimals=) 四舍五入;decimals小數(shù)點(diǎn)位數(shù),負(fù)數(shù)表示小數(shù)點(diǎn)前面的位數(shù)
np.floor()
np.ceil()
集合運(yùn)算
np.intersect1d(x,y)
np.setdiff1d(x,y)
np.union1d(x,y)
四、拓展
- 補(bǔ)充:數(shù)據(jù)IO
np.save('my_array', ndarray)將ndarray保存到叫做my_array.npy的文件中
y = np.load('my_array.npy')
- 補(bǔ)充:小技巧
方法的組合
np.sort(np.unique(x))
- 補(bǔ)充:numpy.linalg
有一個(gè)關(guān)于矩陣分解和像轉(zhuǎn)置和行列式等的一個(gè)標(biāo)準(zhǔn)集合




