Numpy基礎(chǔ)

在逛知乎時發(fā)現(xiàn)機(jī)器之心轉(zhuǎn)發(fā)了一篇文章圖解Numpy初家,感覺寫的非常好辛孵。一直想要系統(tǒng)學(xué)習(xí)一下Numpy可是一直沒有實(shí)踐粗恢,這里先保存一下洛心。


選自Jay Alammar Blog,作者:Jay Alammar葬毫,機(jī)器之心編譯镇辉,參與:高璇、路贴捡。

image

NumPy 軟件包是 Python 生態(tài)系統(tǒng)中數(shù)據(jù)分析忽肛、機(jī)器學(xué)習(xí)和科學(xué)計(jì)算的主力軍。它極大地簡化了向量和矩陣的操作處理烂斋。Python 的一些主要軟件包(如 scikit-learn屹逛、SciPy、pandas 和 tensorflow)都以 NumPy 作為其架構(gòu)的基礎(chǔ)部分汛骂。除了能對數(shù)值數(shù)據(jù)進(jìn)行切片(slice)和切塊(dice)之外罕模,使用 NumPy 還能為處理和調(diào)試上述庫中的高級實(shí)例帶來極大便利。

本文將介紹使用 NumPy 的一些主要方法香缺,以及在將數(shù)據(jù)送入機(jī)器學(xué)習(xí)模型之前手销,它如何表示不同類型的數(shù)據(jù)(表格、圖像图张、文本等)锋拖。

import numpy as np

創(chuàng)建數(shù)組

我們可以通過傳遞一個 python 列表并使用 np.array()來創(chuàng)建 NumPy 數(shù)組(極大可能是多維數(shù)組)。在本例中祸轮,python 創(chuàng)建的數(shù)組如下圖右所示:

image

通常我們希望 NumPy 能初始化數(shù)組的值兽埃,為此 NumPy 提供了 ones()、zeros() 和 random.random() 等方法适袜。我們只需傳遞希望 NumPy 生成的元素數(shù)量即可:

image

一旦創(chuàng)建了數(shù)組柄错,我們就可以盡情對它們進(jìn)行操作。

數(shù)組運(yùn)算

讓我們創(chuàng)建兩個 NumPy 數(shù)組來展示數(shù)組運(yùn)算功能苦酱。我們將下圖兩個數(shù)組稱為 data 和 ones:

image

將它們按位置相加(即每行對應(yīng)相加)售貌,直接輸入 data + ones 即可:

image

當(dāng)我開始學(xué)習(xí)這些工具時,我發(fā)現(xiàn)這樣的抽象讓我不必在循環(huán)中編寫類似計(jì)算疫萤。此類抽象可以使我在更高層面上思考問題颂跨。

除了「加」,我們還可以進(jìn)行如下操作:

image

通常情況下扯饶,我們希望數(shù)組和單個數(shù)字之間也可以進(jìn)行運(yùn)算操作(即向量和標(biāo)量之間的運(yùn)算)恒削。比如說,我們的數(shù)組表示以英里為單位的距離尾序,我們希望將其單位轉(zhuǎn)換為千米钓丰。只需輸入 data * 1.6 即可:

image

看到 NumPy 是如何理解這個運(yùn)算的了嗎?這個概念叫做廣播機(jī)制(broadcasting)每币,它非常有用携丁。

索引

我們可以我們像對 python 列表進(jìn)行切片一樣,對 NumPy 數(shù)組進(jìn)行任意的索引和切片:

image

聚合

NumPy 還提供聚合功能:

image

除了 min兰怠、max 和 sum 之外则北,你還可以使用 mean 得到平均值,使用 prod 得到所有元素的乘積痕慢,使用 std 得到標(biāo)準(zhǔn)差等等尚揣。

更多維度

上述的例子都在一個維度上處理向量。NumPy 之美的關(guān)鍵在于掖举,它能夠?qū)⑸鲜鏊蟹椒☉?yīng)用到任意數(shù)量的維度快骗。

創(chuàng)建矩陣

我們可以傳遞下列形狀的 python 列表,使 NumPy 創(chuàng)建一個矩陣來表示它:

np.array([[1,2],[3,4]])

我們也可以使用上面提到的方法(ones()塔次、zeros() 和 random.random())方篮,只要寫入一個描述我們創(chuàng)建的矩陣維數(shù)的元組即可:

image

矩陣運(yùn)算

如果兩個矩陣大小相同,我們可以使用算術(shù)運(yùn)算符(+-*/)對矩陣進(jìn)行加和乘励负。NumPy 將它們視為 position-wise 運(yùn)算:

image

我們也可以對不同大小的兩個矩陣執(zhí)行此類算術(shù)運(yùn)算藕溅,但前提是某一個維度為 1(如矩陣只有一列或一行),在這種情況下继榆,NumPy 使用廣播規(guī)則執(zhí)行算術(shù)運(yùn)算:

點(diǎn)乘

算術(shù)運(yùn)算和矩陣運(yùn)算的一個關(guān)鍵區(qū)別是矩陣乘法使用點(diǎn)乘巾表。NumPy 為每個矩陣賦予 dot() 方法汁掠,我們可以用它與其他矩陣執(zhí)行點(diǎn)乘操作:

image

我在上圖的右下角添加了矩陣維數(shù),來強(qiáng)調(diào)這兩個矩陣的臨近邊必須有相同的維數(shù)集币。你可以把上述運(yùn)算視為:

image

矩陣索引

當(dāng)我們處理矩陣時考阱,索引和切片操作變得更加有用:

image

矩陣聚合

我們可以像聚合向量一樣聚合矩陣:

image

我們不僅可以聚合矩陣中的所有值,還可以使用 axis 參數(shù)執(zhí)行跨行或跨列聚合:

image

轉(zhuǎn)置和重塑

處理矩陣時的一個常見需求是旋轉(zhuǎn)矩陣鞠苟。當(dāng)需要對兩個矩陣執(zhí)行點(diǎn)乘運(yùn)算并對齊它們共享的維度時乞榨,通常需要進(jìn)行轉(zhuǎn)置。NumPy 數(shù)組有一個方便的方法 T 來求得矩陣轉(zhuǎn)置:

image

在更高級的實(shí)例中当娱,你可能需要變換特定矩陣的維度吃既。在機(jī)器學(xué)習(xí)應(yīng)用中,經(jīng)常會這樣:某個模型對輸入形狀的要求與你的數(shù)據(jù)集不同跨细。在這些情況下鹦倚,NumPy 的 reshape() 方法就可以發(fā)揮作用了。只需將矩陣所需的新維度賦值給它即可扼鞋∩暧悖可以為維度賦值-1,NumPy 可以根據(jù)你的矩陣推斷出正確的維度:

image

再多維度

NumPy 可以在任意維度實(shí)現(xiàn)上述提到的所有內(nèi)容云头。其中心數(shù)據(jù)結(jié)構(gòu)被叫作 ndarray(N 維數(shù)組)不是沒道理的捐友。

image

在很多情況下,處理一個新的維度只需在 NumPy 函數(shù)的參數(shù)中添加一個逗號:

image

實(shí)際用法

以下是 NumPy 可實(shí)現(xiàn)的有用功能的實(shí)例演示溃槐。

公式

實(shí)現(xiàn)可用于矩陣和向量的數(shù)學(xué)公式是 NumPy 的關(guān)鍵用例匣砖。這就是 NumPy 是 python 社區(qū)寵兒的原因。例如均方差公式昏滴,它是監(jiān)督機(jī)器學(xué)習(xí)模型處理回歸問題的核心:

image

在 NumPy 中實(shí)現(xiàn)該公式很容易:

image

這樣做的好處在于猴鲫,NumPy 并不關(guān)心 predictions 和 labels 包含一個值還是一千個值(只要它們大小相同)。我們可以通過一個示例依次執(zhí)行上面代碼行中的四個操作:

image

預(yù)測和標(biāo)簽向量都包含三個值谣殊,也就是說 n 的值為 3拂共。減法后,得到的值如下:

image

然后將向量平方得到:

image

現(xiàn)在對這些值求和:

image

得到的結(jié)果即為該預(yù)測的誤差值和模型質(zhì)量評分姻几。

數(shù)據(jù)表示

考慮所有需要處理和構(gòu)建模型所需的數(shù)據(jù)類型(電子表格宜狐、圖像、音頻等)蛇捌,其中很多都適合在 n 維數(shù)組中表示:

表格和電子表格

電子表格或值表是二維矩陣抚恒。電子表格中的每個工作表都可以是它自己的變量。python 中最流行的抽象是 pandas 數(shù)據(jù)幀络拌,它實(shí)際上使用了 NumPy 并在其之上構(gòu)建俭驮。

image

音頻和時間序列

音頻文件是樣本的一維數(shù)組。每個樣本都是一個數(shù)字春贸,代表音頻信號的一小部分混萝。CD 質(zhì)量的音頻每秒包含 44,100 個樣本遗遵,每個樣本是-65535 到 65536 之間的整數(shù)。這意味著如果你有一個 10 秒的 CD 質(zhì)量 WAVE 文件譬圣,你可以將它加載到長度為 10 * 44,100 = 441,000 的 NumPy 數(shù)組中瓮恭。如果想要提取音頻的第一秒雄坪,只需將文件加載到 audio 的 NumPy 數(shù)組中厘熟,然后獲取 audio[:44100]。

以下是一段音頻文件:

image

時間序列數(shù)據(jù)也是如此(如股票價格隨時間變化)维哈。

圖像

圖像是尺寸(高度 x 寬度)的像素矩陣绳姨。

如果圖像是黑白(即灰度)的,則每個像素都可以用單個數(shù)字表示(通常在 0(黑色)和 255(白色)之間)阔挠。想要裁剪圖像左上角 10 x 10 的像素嗎飘庄?在 NumPy 寫入

即可。

下圖是一個圖像文件的片段:

image

如果圖像是彩色的购撼,則每個像素由三個數(shù)字表示——紅色跪削、綠色和藍(lán)色。在這種情況下迂求,我們需要一個三維數(shù)組(因?yàn)槊總€單元格只能包含一個數(shù)字)碾盐。因此彩色圖像由尺寸為(高 x 寬 x3)的 ndarray 表示:

image

語言

如果我們處理文本,情況就不同了揩局。文本的數(shù)字表示需要一個構(gòu)建詞匯表的步驟(模型知道的唯一字清單)和嵌入步驟毫玖。讓我們看看用數(shù)字表示以下文字的步驟:

模型需要先查看大量文本,再用數(shù)字表示這位詩人的話語凌盯。我們可以讓它處理一個小數(shù)據(jù)集付枫,并用它來構(gòu)建一個詞匯表(71,290 個單詞):

image

這個句子可以被分成一個 token 數(shù)組(基于通用規(guī)則的單詞或單詞的一部分):

image

然后我們用詞匯表中的 ID 替換每個單詞:

image

這些 ID 仍然沒有為模型提供太多信息價值。因此驰怎,在將這一組單詞輸入到模型之前阐滩,我們需要用嵌入替換 token/單詞(在本例中為 50 維 word2vec 嵌入):

image

可以看到,該 NumPy 數(shù)組的維度為 [embedding_dimension x sequence_length]县忌。出于性能原因掂榔,深度學(xué)習(xí)模型傾向于保留批大小的第一維(因?yàn)槿绻⑿杏?xùn)練多個示例,模型訓(xùn)練速度會加快)芹枷。在這種情況下衅疙,reshape() 變得非常有用。如像 BERT 這樣的模型期望的輸入形式是:[batch_size鸳慈,sequence_length饱溢,embedding_size]。

image

現(xiàn)在這是 numeric volume 形式走芋,模型可以處理并執(zhí)行相應(yīng)操作绩郎。其他行雖然留空潘鲫,但是它們會被填充其他示例以供模型訓(xùn)練(或預(yù)測)。

image

原文鏈接:https://jalammar.github.io/visual-numpy/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肋杖,一起剝皮案震驚了整個濱河市溉仑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌状植,老刑警劉巖浊竟,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異津畸,居然都是意外死亡振定,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門肉拓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來后频,“玉大人,你說我怎么就攤上這事暖途”跋В” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵驻售,是天一觀的道長露久。 經(jīng)常有香客問我,道長芋浮,這世上最難降的妖魔是什么抱环? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮纸巷,結(jié)果婚禮上镇草,老公的妹妹穿的比我還像新娘。我一直安慰自己瘤旨,他們只是感情好梯啤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著存哲,像睡著了一般因宇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祟偷,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天察滑,我揣著相機(jī)與錄音,去河邊找鬼修肠。 笑死贺辰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饲化,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼莽鸭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吃靠?” 一聲冷哼從身側(cè)響起硫眨,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巢块,沒想到半個月后礁阁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夕冲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年氮兵,在試婚紗的時候發(fā)現(xiàn)自己被綠了裂逐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歹鱼。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卜高,靈堂內(nèi)的尸體忽然破棺而出弥姻,到底是詐尸還是另有隱情,我是刑警寧澤掺涛,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布庭敦,位于F島的核電站,受9級特大地震影響薪缆,放射性物質(zhì)發(fā)生泄漏秧廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一拣帽、第九天 我趴在偏房一處隱蔽的房頂上張望疼电。 院中可真熱鬧,春花似錦减拭、人聲如沸蔽豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽修陡。三九已至,卻和暖如春可霎,著一層夾襖步出監(jiān)牢的瞬間魄鸦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工癣朗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拾因,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像盾致,于是被迫代替她去往敵國和親主经。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容