[NumPy]基礎(chǔ)大全

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


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

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

  1. 數(shù)值型索引
  2. 布爾型索引
    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)
  3. 切片
    左閉右開,提取某行/列
    將數(shù)據(jù)集拆分為訓(xùn)練集桥言、交叉驗證集和測試集
    ndarray[start : end]
    ndarray[start : ]
    ndarray[: end]
    注意:Z = X[1:4,2:5] 對 Z 做出更改萌踱,也會更改原始數(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() 接受兩個一維數(shù)組并產(chǎn)生二維矩陣
    np.concatenate(axis=) 多個矩陣合并
  3. 分割
    .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. 先去掉外層的[]:[1], [2] 與 [3, 4]
  2. 針對內(nèi)層的[]:1和3, 4生成[3, 4]
  3. 最后生成維度(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ù)組)

  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)時氨距,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)用:針對反向傳播
  1. 利用轉(zhuǎn)置-調(diào)換位置計算反向誤差
    反向誤差error
  2. 權(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

補充:

  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 兩個形狀不同的 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)集合


References

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驶兜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子远寸,更是在濱河造成了極大的恐慌抄淑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驰后,死亡現(xiàn)場離奇詭異肆资,居然都是意外死亡,警方通過查閱死者的電腦和手機灶芝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門郑原,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夜涕,你說我怎么就攤上這事犯犁。” “怎么了女器?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵酸役,是天一觀的道長。 經(jīng)常有香客問我驾胆,道長涣澡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任丧诺,我火速辦了婚禮暑塑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锅必。我一直安慰自己事格,他們只是感情好惕艳,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驹愚,像睡著了一般远搪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逢捺,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天谁鳍,我揣著相機與錄音,去河邊找鬼劫瞳。 笑死倘潜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的志于。 我是一名探鬼主播涮因,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伺绽!你這毒婦竟也來了养泡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奈应,失蹤者是張志新(化名)和其女友劉穎澜掩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杖挣,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡肩榕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惩妇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片点把。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屿附,靈堂內(nèi)的尸體忽然破棺而出郎逃,到底是詐尸還是另有隱情,我是刑警寧澤挺份,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布褒翰,位于F島的核電站,受9級特大地震影響匀泊,放射性物質(zhì)發(fā)生泄漏优训。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一各聘、第九天 我趴在偏房一處隱蔽的房頂上張望揣非。 院中可真熱鬧,春花似錦躲因、人聲如沸早敬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搞监。三九已至水孩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琐驴,已是汗流浹背俘种。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绝淡,地道東北人宙刘。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像牢酵,于是被迫代替她去往敵國和親悬包。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355