[NumPy]基礎(chǔ)大全

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]等


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

注意: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) 類似python range();允許間隔為非整數(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

  1. 數(shù)值型索引
  2. 布爾型索引
    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)
  3. 切片
    左閉右開,提取某行/列
    將數(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)的元素

  1. 索引修改

np.clip(A,5,9) 設(shè)定上下限,在5-9之間,保持原始數(shù)據(jù)不變,小于5,則為5;大于9則為9
ndarray.flatten() 多維變?yōu)橐痪S

  1. 數(shù)組轉(zhuǎn)置為矩陣
    A[np.newaxis,:] (3,)變?yōu)?1, 3)
    A[:,np.newaxis]
  2. 合并
    np.vstack((ndarray1, ndarray2)) 上下-垂直堆疊
    np.hstack((ndarray1, ndarray2)) 水平堆疊
    np.meshgrid() 接受兩個(gè)一維數(shù)組并產(chǎn)生二維矩陣
    np.concatenate(axis=) 多個(gè)矩陣合并
  3. 分割
    .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. 先去掉外層的[]:[1], [2] 與 [3, 4]
  2. 針對(duì)內(nèi)層的[]:1和3, 4生成[3, 4]
  3. 最后生成維度(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ù)組)

  1. 當(dāng)data是一維數(shù)組(n,),相當(dāng)于轉(zhuǎn)置(行、列向量的轉(zhuǎn)換)
    構(gòu)造新的列:一維數(shù)據(jù)變?yōu)槎S
  2. 當(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ì)反向傳播
  1. 利用轉(zhuǎn)置-調(diào)換位置計(jì)算反向誤差
    反向誤差error
  2. 權(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ǔ)充:

  1. 如果a是N維數(shù)組, b是1維數(shù)組,如(3,3,3)與(3,)矩陣相乘的結(jié)果是(3,3)
  2. 如果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)集合


References

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

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