這是我見過最好的 NumPy 圖解教程!

NumPy 是 Python 中用於數據分析、機器學習、科學計算的重要軟件包。它極大地簡化了向量和矩陣的操作及處理。python 的不少數據處理軟件包依賴於 NumPy 作爲其基礎架構的核心部分(例如 scikit-learn、SciPy、pandas 和 tensorflow)。除了數據切片和數據切塊的功能之外,掌握 numpy 也使得開發者在使用各數據處理庫調試和處理複雜用例時更具優勢。

在本文中,將介紹 NumPy 的主要用法,以及它如何呈現不同類型的數據(表格,圖像,文本等),這些經 Numpy 處理後的數據將成爲機器學習模型的輸入。

NumPy 中的數組操作

創建數組

我們可以通過將 python 列表傳入 np.array() 來創建一個 NumPy 數組(也就是強大的 ndarray)。在下面的例子裏,創建出的數組如右邊所示,通常情況下,我們希望 NumPy 爲我們初始化數組的值,爲此 NumPy 提供了諸如 ones(),zeros() 和 random.random() 之類的方法。我們只需傳入元素個數即可:

一旦我們創建了數組,我們就可以用其做點有趣的應用了,文摘菌將在下文展開說明。

數組的算術運算

讓我們創建兩個 NumPy 數組,分別稱作 data 和 ones:

若要計算兩個數組的加法,只需簡單地敲入 data + ones,就可以實現對應位置上的數據相加的操作(即每行數據進行相加),這種操作比循環讀取數組的方法代碼實現更加簡潔。

當然,在此基礎上舉一反三,也可以實現減法、乘法和除法等操作:

許多情況下,我們希望進行數組和單個數值的操作(也稱作向量和標量之間的操作)。比如:如果數組表示的是以英里爲單位的距離,我們的目標是將其轉換爲公里數。可以簡單的寫作 data * 1.6:

NumPy 通過數組廣播(broadcasting)知道這種操作需要和數組的每個元素相乘。

數組的切片操作

我們可以像 python 列表操作那樣對 NumPy 數組進行索引和切片,如下圖所示:

聚合函數

NumPy 爲我們帶來的便利還有聚合函數,聚合函數可以將數據進行壓縮,統計數組中的一些特徵值:

除了 min,max 和 sum 等函數,還有 mean(均值),prod(數據乘法)計算所有元素的乘積,std(標準差),等等。上面的所有例子都在一個維度上處理向量。除此之外,NumPy 之美的一個關鍵之處是它能夠將之前所看到的所有函數應用到任意維度上。

NumPy 中的矩陣操作

創建矩陣

我們可以通過將二維列表傳給 Numpy 來創建矩陣。

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

除此外,也可以使用上文提到的 ones()、zeros() 和 random.random() 來創建矩陣,只需傳入一個元組來描述矩陣的維度:

矩陣的算術運算

對於大小相同的兩個矩陣,我們可以使用算術運算符(+-*/)將其相加或者相乘。NumPy 對這類運算採用對應位置(position-wise)操作處理:

對於不同大小的矩陣,只有兩個矩陣的維度同爲 1 時(例如矩陣只有一列或一行),我們才能進行這些算術運算,在這種情況下,NumPy 使用廣播規則(broadcast)進行操作處理:

與算術運算有很大區別是使用點積的矩陣乘法。NumPy 提供了 dot() 方法,可用於矩陣之間進行點積運算:

上圖的底部添加了矩陣尺寸,以強調運算的兩個矩陣在列和行必須相等。可以將此操作圖解爲如下所示:

矩陣的切片和聚合

索引和切片功能在操作矩陣時變得更加有用。可以在不同維度上使用索引操作來對數據進行切片。

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

不僅可以聚合矩陣中的所有值,還可以使用 axis 參數指定行和列的聚合:

矩陣的轉置和重構

處理矩陣時經常需要對矩陣進行轉置操作,常見的情況如計算兩個矩陣的點積。NumPy 數組的屬性 T 可用於獲取矩陣的轉置。

在較爲複雜的用例中,你可能會發現自己需要改變某個矩陣的維度。這在機器學習應用中很常見,例如模型的輸入矩陣形狀與數據集不同,可以使用 NumPy 的 reshape() 方法。只需將矩陣所需的新維度傳入即可。也可以傳入 - 1,NumPy 可以根據你的矩陣推斷出正確的維度:

上文中的所有功能都適用於多維數據,其中心數據結構稱爲 ndarray(N 維數組)。

很多時候,改變維度只需在 NumPy 函數的參數中添加一個逗號,如下圖所示:

NumPy 中的公式應用示例

NumPy 的關鍵用例是實現適用於矩陣和向量的數學公式。這也 Python 中常用 NumPy 的原因。例如,均方誤差是監督機器學習模型處理迴歸問題的核心:

在 NumPy 中可以很容易地實現均方誤差:

這樣做的好處是,numpy 無需考慮 predictions 與 labels 具體包含的值。文摘菌將通過一個示例來逐步執行上面代碼行中的四個操作:

預測(predictions)和標籤(labels)向量都包含三個值。這意味着 n 的值爲 3。在我們執行減法後,我們最終得到如下值:

然後我們可以計算向量中各值的平方:

現在我們對這些值求和:

最終得到該預測的誤差值和模型質量分數。

用 NumPy 表示日常數據

日常接觸到的數據類型,如電子表格,圖像,音頻...... 等,如何表示呢?Numpy 可以解決這個問題。

表和電子表格

電子表格或數據表都是二維矩陣。電子表格中的每個工作表都可以是自己的變量。python 中類似的結構是 pandas 數據幀(dataframe),它實際上使用 NumPy 來構建的。

音頻和時間序列

音頻文件是一維樣本數組。每個樣本都是代表一小段音頻信號的數字。CD 質量的音頻每秒可能有 44,100 個採樣樣本,每個樣本是一個 - 65535 到 65536 之間的整數。這意味着如果你有一個 10 秒的 CD 質量的 WAVE 文件,你可以將它加載到長度爲 10 * 44,100 = 441,000 個樣本的 NumPy 數組中。想要提取音頻的第一秒?只需將文件加載到我們稱之爲 audio 的 NumPy 數組中,然後截取 audio[:44100]。

以下是一段音頻文件:

時間序列數據也是如此(例如,股票價格隨時間變化的序列)。

圖像

圖像是大小爲(高度 × 寬度)的像素矩陣。如果圖像是黑白圖像(也稱爲灰度圖像),則每個像素可以由單個數字表示(通常在 0(黑色)和 255(白色)之間)。如果對圖像做處理,裁剪圖像的左上角 10 x 10 大小的一塊像素區域,用 NumPy 中的 image[:10,:10] 就可以實現。

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

如果圖像是彩色的,則每個像素由三個數字表示 :紅色,綠色和藍色。在這種情況下,我們需要第三維(因爲每個單元格只能包含一個數字)。因此彩色圖像由尺寸爲 (高 x 寬 x 3)的 ndarray 表示。

語言

如果我們處理文本,情況就會有所不同。用數字表示文本需要兩個步驟,構建詞彙表(模型知道的所有唯一單詞的清單)和嵌入(embedding)。讓我們看看用數字表示這個(翻譯的)古語引用的步驟:“Have the bards who preceded me left any theme unsung?”

模型需要先訓練大量文本才能用數字表示這位戰場詩人的詩句。我們可以讓模型處理一個小數據集,並使用這個數據集來構建一個詞彙表(71,290 個單詞):

然後可以將句子劃分成一系列 “詞”token(基於通用規則的單詞或單詞部分):

然後我們用詞彙表中的 id 替換每個單詞:

這些 ID 仍然不能爲模型提供有價值的信息。因此,在將一系列單詞送入模型之前,需要使用嵌入(embedding)來替換 token / 單詞(在本例子中使用 50 維度的 word2vec 嵌入):

你可以看到此 NumPy 數組的維度爲 [embedding_dimension x sequence_length]。

在實踐中,這些數值不一定是這樣的,但我以這種方式呈現它是爲了視覺上的一致。出於性能原因,深度學習模型傾向於保留批數據大小的第一維(因爲如果並行訓練多個示例,則可以更快地訓練模型)。很明顯,這裏非常適合使用 reshape()。例如,像 BERT 這樣的模型會期望其輸入矩陣的形狀爲:[batch_size,sequence_length,embedding_size]。

這是一個數字合集,模型可以處理並執行各種有用的操作。我留空了許多行,可以用其他示例填充以供模型訓練(或預測)。

事實證明,在我們的例子中,那位詩人的話語比其他詩人的詩句更加名垂千古。儘管生而爲奴,詩人安塔拉(Antarah)的英勇和語言能力使他獲得了自由和神話般的地位,他的詩是伊斯蘭教以前的阿拉伯半島《懸詩》的七首詩之一。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ym7RyA8Oxj8FRvft7ElzHg