Numpy 簡介: 使用python進入數據科學的世界!
source: https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial
聲明:本篇推送的主要內容翻譯自:
https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial
學習目標:
1.創建Numpy 數組
2.Numpy數組的簡單運算運算
3.從numpy數組中提取信息
4.對numpy數組中的元素進行排序
5.連接(concatenate) numpy數組
如果您閱讀了之前的幾篇推送,相信您已經對python語言以及電腦程式設計有了一定的了解。在現今萬物開始互聯的時代,對於數字信息與數據的獲取與處理能力是每個人應該掌握的技能,今天這篇推送將為大家簡單介紹Numpy工具庫。
在先前的推送中,我們曾經使用numpy進行過簡單的統計數據計算,但是還沒來得及說明numpy是什麼,為什麼要學習它,以及系統地講解它的使用方法。
Numpy是針對python語言編寫的一個強大的數值運算函數庫,它的優點就包括:
1.運算速度快
2.通過向量運算減少代碼中的循環結構
3.包含豐富的數值計算函數
4.是許多更高級數據科學工具的基礎
讓我們以一個簡單的案例開始,假設您給學生布置了一項測驗,但是因為測驗內容過難,大多數學生的成績都不如平常,所以您想對學生的分數進行處理,讓它更能體現學生的真實水平。所以您打算這麼處理:
1.計算所有學生成績的平均分,把平均分當做C等級的分數
2.對所有學生的成績加上(80-平均分)
運行該程序,您將在解釋器中得到
在以上的代碼中,最重要的是第二行,
它創建了一個numpy一維數組,由8個元素構成。使用numpy數組最方便地方在於它可以實現向量化的運算。例如:
得到的結果是:
即數組中對應位置元素的和
numpy數組還是方便的實現廣播,即將一個數值加到一組數的所有元素上
這也就是為什麼說,使用numpy數據結構可以大大減少循環結構的使用頻率。
下面來創建一個二維數組
這個二維數組,可以看成是這樣一個矩陣
也可以把矩陣看成是向量(一維矩陣)的組合。所以對於這樣一個矩陣,它可以由兩組向量組合代表,一組是將每一行看成是一個向量,另一組是將每一列看成一個向量。這個方向在數值計算中非常重要,就以找最大值為例:
得到的輸出信息是:
第一種方法是找到矩陣中所有元素的最大值(9), 第二個方法是找到每一列中的最大值,並由此構成了一個新的一維數組,這裡的axis=0,是選擇沿著每一列進行數值計算。同理第三種情況是沿著每一個行向量,找到其最大值,並整合成一個一維數組。
數組間的廣播運算(Broadcasting)
Numpy 允許不同形狀的數組進行廣播運算。例如:我們在這裡創建兩個不同形狀的二維數組
a是一個2*8的二維數組,b是一個1*8的二維數組,我們可以這樣表示,, ,即用行向量來表示這兩個數組。
先從c的形狀來分析,它是一個2*8的二維數組,同時發現每一行是數組a中每一行加數組b的數值,這也就是數組b的數值被」廣播」到了數組a的每一行中。
從數組中提取數據
創建這樣一個二維數組
現在來計算這個數組中:
1.每一行的和
2.每一列的和
3.兩組對角線元素的和
4.將這個矩陣劃分為一個由4個2*2子矩陣構成的矩陣,計算每個子矩陣的和
對於數組元素,採用與python列表一樣的序號索引,維度之間用逗號隔開。對於二維數組,第一位是行標,第二位是列標。例如square[:,1]代表第二列所有元素。同理,square[1,:]代表第二行的所有元素。
下面來計算兩組對角元素的和
這裡使用-(i+1)作為元素序號表示從右邊開始選取元素。例如square[0,-1]表示square中第一行倒數第一個元素,square[1,-2]表示第二行倒數第二個元素。
接著計算計算四個子矩陣的和:
以upper_left為例,[:2,:2]表示其前兩行與前兩列所有元素的交集,即矩陣左上角的四個元素,接著使用.sum()得到這四個元素的和。
除了通過元素位置來獲取信息,還可以通過masking來從矩陣中截取符合要求的信息。它的基本工作原理是,建立一個與原數組相同形狀的數組,這個數組的元素只允許有兩個值, 真或者假(True, False).
下面以一個例子介紹這種信息提取的方法:
首先生成一個數組
生成這個數組用到了幾個常用numpy函數,np.linspace(5,50,24,dtype)表示從區間[5,50]中等距離選取24個元素,將每個元素的類型設置為整數(dtype=int). 最後使用.reshape()轉換成二維數組。Reshape(4,-1)中的-1表示,numpy會根據元素個數和行的數目(4)自動計算列的數目。
然後生成mask數組
最後將mask作用於原數組
這裡需注意的是,經過mask過濾的元素組成的是一個一維數組。
當然也可以將以上兩個步驟縮減為一行代碼
我們還可以使用numpy來驗證統計學的一個基本事實: 在正態分布中, 約95%的數值都分布在以均值為中心的兩個標準差以內。
以下是進行了10次的隨機試驗的結果
使用Numpy進行排序
在默認情況下,np.sort()將對數組最內側括號中的元素進行排序
如果將axis參數設置為None, 將會對所有元素進行排序,並輸出一個排列好的一維數組
如果想獲得一個逆序的排列,使用
要將每一列進行排序,將參數axis設置為0
使用numpy連接數組
今天只是向大家簡單介紹numpy的使用方法,今後還會有更多關於numpy的使用案例。請大家關注北大附中技術中心公眾號!!