首頁  >  文章  >  後端開發  >  技巧 | 這可能是我看過最好的NumPy圖解教學!

技巧 | 這可能是我看過最好的NumPy圖解教學!

Python当打之年
Python当打之年轉載
2023-08-10 16:08:121167瀏覽


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


#



NumPy中的陣列運算






技巧 | 這可能是我看過最好的NumPy圖解教學!#建立陣列

############我們可以透過將python清單傳入np.array()來建立一個NumPy陣列(也就是強大的ndarray)。在下面的例子裡,創建出的數組如右邊所示,通常情況下,我們希望NumPy為我們初始化數組的值,為此NumPy提供了諸如ones(),zeros()和random.random()之類的方法。我們只需傳入元素個數即可:############### #############一旦我們建立了數組,我們就可以用其來做點有趣的應用了,文摘菌將在下文展開說明。 ######


陣列的算術運算


#讓我們建立兩個NumPy數組,分別稱呼作data與ones:


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


陣列的切片運算


##########################

我們可以像python列表運算一樣對NumPy陣列進行索引和切片,如下圖所示:


技巧 | 這可能是我看過最好的NumPy圖解教學!


##聚合函數


#NumPy為我們帶來的便利性還有聚合函數,聚合函數可以將資料壓縮,統計數組中的一些特徵值:


技巧 | 這可能是我看過最好的NumPy圖解教學!


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





NumPy中的矩陣運算




創建矩陣

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

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

########

技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


矩陣的算術運算


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!



技巧 | 這可能是我看過最好的NumPy圖解教學!

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


矩陣的切片和聚合


#索引和切片函數在運算元時變得更有用。可以在不同維度上使用索引操作來對資料進行切片。


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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

#


技巧 | 這可能是我看過最好的NumPy圖解教學!


#矩陣的轉置與重構


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!





NumPy中的公式應用範例






技巧 | 這可能是我看過最好的NumPy圖解教學!


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


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

技巧 | 這可能是我看過最好的NumPy圖解教學!


這樣做的好處是,numpy不需要考慮predictions與labels具體包含的值。文摘菌將透過一個範例來逐步執行上面程式碼行中的四個動作:


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!


#現在我們對這些值求和:


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


#



以NumPy表示日常資料






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

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


技巧 | 這可能是我看過最好的NumPy圖解教學!


#音訊與時間序列


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


以下是一段音訊檔案:


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


圖片


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


這是一個映像檔的片段:


技巧 | 這可能是我看過最好的NumPy圖解教學!


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


技巧 | 這可能是我看過最好的NumPy圖解教學!





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

技巧 | 這可能是我看過最好的NumPy圖解教學!

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

################# ################

然後可以將句子分成一系列「單字」token(基於通用規則的單字或單字部分):


技巧 | 這可能是我看過最好的NumPy圖解教學!


然後我們用詞彙表中的id取代每個單字:


技巧 | 這可能是我看過最好的NumPy圖解教學!


這些ID仍然無法為模型提供有價值的資訊。因此,在將一系列單字送入模型之前,需要使用嵌入(embedding)來取代token/單字(在本範例中使用50維度的word2vec嵌入):


技巧 | 這可能是我看過最好的NumPy圖解教學!


你可以看到這個NumPy陣列的維度為[embedding_dimension x sequence_length]。


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


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

#

以上是技巧 | 這可能是我看過最好的NumPy圖解教學!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Python当打之年。如有侵權,請聯絡admin@php.cn刪除