import numpy as np
一、數(shù)據(jù)類型簡介
Numerical Python:底層代碼為C,支持處理大量數(shù)據(jù)
所有 Numpy 數(shù)據(jù)類型都是 numpy.generic 的子類
支持向量運算:N維數(shù)組對象瘪板,只允許存儲相同的數(shù)據(jù)類型
支持 float淑仆、int、bool加叁、timedelta[ns]倦沧、datetime64[ns]等
注意:Numpy 不支持帶時區(qū)信息的 datetime
- 數(shù)據(jù)結(jié)構(gòu)的特性
多維數(shù)組np.array():向量、矩陣運算
默認(rèn)行向量
axis = 0 表示跨行它匕;
axis = 1 表示跨列刀脏;
支持的數(shù)據(jù)類型@圖-核心、創(chuàng)建超凳、保存
實用的線性代數(shù)愈污、傅里葉變換和隨機數(shù)生成函數(shù)
和稀疏矩陣運算包scipy配合使用更加方便
二、具體操作
- 區(qū)分函數(shù)與方法 (以reshape為例)
目標(biāo)類型 | 說明 |
---|---|
函數(shù) | 基于模塊 np.reshape(array, [index參數(shù)]) +傳遞實參 +不修改原始數(shù)據(jù)——>需要賦值轮傍,或者直接輸出 |
方法 | ndarray.reshape() +相當(dāng)于以array為對象進行的操作/屬性 +更改原始數(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)
每個值都接近于零
np.ones(shape)
np.full(shape, constant value)
np.eye(N)
np.diag([對角線元素列表])
np.arange(start,stop,step)
左閉右開[start, stop) 類似pythonrange()
;允許間隔為非整數(shù)创夜,例如 0.3杭跪,但是由于浮點數(shù)精度有限, 建議np.linspace()
np.linspace(start, stop, N)
隨機數(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)計學(xué)特定分布特性
np.random.permutation(N)
創(chuàng)建一個秩為 1 的 ndarray,其中包含隨機排列的行索引(用來隨機打亂數(shù)據(jù)集-N個元素的順序)
- 查/改/增/刪
屬性:數(shù)據(jù)類型
.dtype
具體元素的類型
.dtype.name
查看數(shù)據(jù)類型,name是.dtype的一個屬性
.astype(np.float64)
轉(zhuǎn)換數(shù)據(jù)類型
注意:修改數(shù)據(jù)類型涧尿,只能用.astype查
- 數(shù)值型索引
- 布爾型索引
ndarray[np.where(邏輯判斷表達式)]
np.where(x>0,x,0)
小于0的值用0填充系奉,大于0的數(shù)不變,是三元表達式 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()
非零檢測姑廉,第一個array表示行坐標(biāo)缺亮,第二個array表示列坐標(biāo)- 切片
左閉右開,提取某行/列
將數(shù)據(jù)集拆分為訓(xùn)練集桥言、交叉驗證集和測試集
ndarray[start : end]
ndarray[start : ]
ndarray[: end]
注意:Z = X[1:4,2:5] 對 Z 做出更改萌踱,也會更改原始數(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()
接受兩個一維數(shù)組并產(chǎn)生二維矩陣
np.concatenate(axis=)
多個矩陣合并- 分割
.reshape()
- 均勻分割
np.split(axis=0)
默認(rèn)水平線分割(跨行)
np.vsplit()
橫向分割园担,等價于np.split(axis=0)
np.hsplit()
默認(rèn)垂直線分割(跨列),等價于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)計
排序
np.sort(ndarray, axis= )
當(dāng)做函數(shù)使用時,它不會對ndarray進行就地排序遍歷
np.diag(ndarray, k=N)
k=0卤档,表示主對角線(對角線元素提取)
for … in
統(tǒng)計
.shape
維度
.size
元素個數(shù)
len(x)
輸出的矩陣長度蝙泼,也就是所謂的行數(shù)
.ndim
可以輸出矩陣維數(shù),即列數(shù)
np.bincount(ndarray)
統(tǒng)計索引出現(xiàn)次數(shù) 下標(biāo)0劝枣、1汤踏、2等出現(xiàn)的次數(shù)
np.bincount(ndarray, weights=[])
權(quán)重列表的元素個數(shù)與ndarray對應(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é)計算
- 元素
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層中括號[]
ndarray矩陣相乘的本質(zhì)(底層邏輯)
- 實例:
np.dot((2, 1), (2, ))
報錯(雖然第二個默認(rèn)行向量哗脖,但終究不是1*2的行向量)
(2, 1): [[1], [2]]
(2, ): [3, 4]
(1, 2): [[3, 4]]正確的運算應(yīng)該是:
np.dot((2, 1), (1, 2))
- 先去掉外層的[]:[1], [2] 與 [3, 4]
- 針對內(nèi)層的[]:1和3, 4生成[3, 4]
- 最后生成
維度(2, 2)
的矩陣
注意:
np.dot((2, ), (2, 1)) == (1, )
默認(rèn)行向量補充:
data[:, None]
本意:對一維數(shù)組來說,轉(zhuǎn)置還是行向量(Numpy默認(rèn)一維數(shù)組為行向量)扳还,所以可以用 arr[:,None] 來創(chuàng)建一個列向量(本質(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)
時氨距,data[:, None]
生成(1,1,n)
神經(jīng)網(wǎng)絡(luò)反向傳播的啟發(fā)
默認(rèn)行向量桑逝,可用
.flatten()
或.ravel()
轉(zhuǎn)化為一維數(shù)組(默認(rèn)行向量)
- Hadamard乘積(對應(yīng)元素相乘)
np.multiply()
*
乘法
一維數(shù)組對應(yīng)元素相乘(2, )*(2, )=(2, )
矩陣相乘
一維數(shù)組內(nèi)積np.dot((2, )(2, )) ==(1, )
一維數(shù)組相乘:列*行得到矩陣@權(quán)重的更新,用.reshape()
np.dot()
各種情況匯總(主要針對一維數(shù)組俏让,二維數(shù)組-行向量/列向量)
(1, n) & (n, ) == (1, )
生成一維數(shù)組
(n, ) & (n, 3) == (3, )
: (n, 3)&(n, )報錯
(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)用:針對反向傳播
- 利用轉(zhuǎn)置-調(diào)換位置計算反向誤差
反向誤差error- 權(quán)重更新:列*行生成權(quán)重矩陣
當(dāng)x, y均為一維數(shù)組時楞遏,下列兩種方法等價
x[:, None] * y
y * x[:, None]
權(quán)重更新矩陣
轉(zhuǎn)置
ndarray.T
ndarray.transpose()
.swapaxes()
接受一對軸變換
.reshape()
矩陣相乘
np.dot(a, b)
等價于a.dot(b)
如果a b都是一維的茬暇,表示內(nèi)積;如果是二維以上寡喝,則為矩陣相乘
np.matmul(a, b)
矩陣乘積
注意:當(dāng)a或b其中一個是標(biāo)量的時候糙俗,只能用np.dot
,或*
预鬓,等價于元素乘法np.multiply
補充:
- 如果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 兩個形狀不同的 ndarray之間:形狀相適應(yīng)(尾部維度必須兼容)
本質(zhì):np.tile(ndarray, shape)
按照shape重復(fù)ndarray元素
ndarray 廣播機制 特性:統(tǒng)計學(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()
累計和
.cumprod()
累計積
np.diff(x,axis=1)
默認(rèn)axis=1 后面元素減去前面元素
np.around(decimals=)
四舍五入蟋定;decimals小數(shù)點位數(shù),負(fù)數(shù)表示小數(shù)點前面的位數(shù)
np.floor()
np.ceil()
集合運算
np.intersect1d(x,y)
np.setdiff1d(x,y)
np.union1d(x,y)
四草添、拓展
- 補充:數(shù)據(jù)IO
np.save('my_array', ndarray)
將ndarray保存到叫做my_array.npy的文件中
y = np.load('my_array.npy')
- 補充:小技巧
方法的組合
np.sort(np.unique(x))
- 補充:numpy.linalg
有一個關(guān)于矩陣分解和像轉(zhuǎn)置和行列式等的一個標(biāo)準(zhǔn)集合