1. 程式人生 > 實用技巧 >科學計算庫-Numpy學習

科學計算庫-Numpy學習

NumPyNumerical Python)是高效能科學計算資料分析的基礎包。它極大的簡化了多維陣列的操縱和處理,大部分資料處理軟體包都依賴於Numpy,例如pandasmatplotlibscikit-learn等。

Numpy的一些特點:

  • NumPy 提供了對陣列和矩陣進行快速運算的標準數學函式

  • NumPy 提供了很多向量運算的介面,比手動用迴圈實現速度要快很多;NumPy開放原始碼,由許多協作者共同維護開發。

  • ……

Python標準庫中預設不包含Numpy,推薦兩種安裝方式:

  • 使用Anaconda軟體,簡化包的管理,自帶Numpy、matplotlib等資料處理包;

  • 使用pip命令安裝:pip install numpy

多維陣列物件-ndarray

NumPy 最重要的一個特點是其N維陣列物件 ndarray,它是用於存放同類型元素的多維陣列,ndarray 中的每個元素在記憶體中佔有相同大小的區域。建立ndarray物件時,可以通過dtype指定資料型別,如果沒有指定,則會根據元素內容自動確定

建立ndarray的方法很多,例如可通過array()asarray()將列表或元組轉化為ndarray,通過arange()生成一組數,通過ones()zeros()full()生成元素相同的一些特殊陣列,通過linspace()

logspace()分別生成等差和等比陣列等,方法詳細說明如下:

注意:指定陣列形狀時,只能是整數如8、12等表示一維陣列中元素的個數或者整數序列如[3,5],(2, 3, 4)等,序列的長度表示維度,每個元素的值表示對應維度上軸的大小

多維陣列物件ndarray的主要屬性包括shape(形狀)、ndim(維度)、size(元素個數)、dtype(元素型別)、itemsize(每個元素所佔位元組數)、nbytes(整個陣列所佔位元組數)等。各自含義和用法如下:

多維陣列物件ndarray的主要方法包括reshape(形狀)、flatten(將多維陣列壓平為1維陣列

)、astype(指定元素型別)、sum(求和)、cumsum(累積求和)、max(求最大)、min(求最小值)、mean(求平均值)等。方法的詳細介紹及其用法如下:

索引和切片

ndarray 物件的索引和切片操作,與序列的索引和切片操作類似。索引支援正向索引從左到右,下標從0開始不斷增大反向索引從右到左,下標從-1開始不斷減小。切片操作可通過slice函式,設定start、stop和step引數進行;也可以通過冒號分隔切片引數 start:stop:step進行。對於多維陣列來說,可以分別對每一個維度進行索引和切片多個維度的索引和切片之間用逗號隔開

序列進行切片操作後,會生成一個新的序列,相當於是將相應的元素複製出來組成了一個新的序列。與此不同,ndarray切片結果並不會單獨生成一個新的ndarray,訪問的仍然是原始的ndarray中的資料,因此對切片結果的修改會影響到原始資料

下面以一個具體例子,來理解索引和切片的用法。

此外,Numpy中還提供了一些特殊的索引方式,例如整數陣列索引布林索引花式索引

整數陣列索引主要用於同時訪問多個無規律的元素,用整數陣列作為索引,一個整數陣列表示一個維度,有多少個維度就需要多少個整數陣列,整數陣列中用於存放各元素在這一維度的索引

布林索引通過布林運算來獲取符合一定條件的元素,對一個多維陣列使用布林運算時,會對陣列中的每一個元素執行布林運算,最終得到一個元素為True或False的多維陣列,然後將這個多維布林陣列作為索引,此時會取出True對應位置上的資料

花式索引根據索引陣列的值作為目標陣列的某個軸的下標來取值。對於使用一維整型陣列作為索引,如果目標是一維陣列,那麼索引的結果就是對應位置的元素;如果目標是二維陣列,那麼就是對應下標的行

如果需要按照自定義的順序獲取某些行列的資料,可使用np.ix_方法,用法為:a[np.ix_([行序],[列序])]注意和整數陣列索引的區別

Numpy中為我們提供了很多高效能的科學計算和資料分析函式,包括各種各樣的數學函式、用於生成隨機數特定概率分佈樣本的函式、統計分析中經常用到的函式以及其他一些常用函式。

Numpy中的數學函式

Numpy中提供的數學函式含義大部分與數學庫中的函式一致,當對多維陣列執行數學函式時,會對裡面的每一個元素執行相應的函式,並將結果儲存到相應的位置,簡單、高效。實際上,我們完全可以通過迴圈,使用資料庫中的函式實現相同效果,但操作麻煩、效能不高。主要的數學函式及其作用如下:

Numpy生成隨機數

numpy.random模組對Python內建的random進行了補充,增加了一些用於高效生成多種概率分佈的樣本值的函式。常見的方法如下:

Numpy中的統計方法

Numpy中提供了大量的用於統計分析的方法,例如求和、求均值、求中位數、求方差、求標準差、求相關係數、去重等等,大部分方法既支援對整體資料運算,也支援對某一個維度進行運算。具體方法及其含義如下:

Numpy中其他常用方法

此外,Numpy中還有一些好用的方法,例如擴充套件陣列、將陣列儲存到檔案、判斷陣列中元素是否滿足某一條件、對資料進行排序等等。具體方法及其含義如下:

Numpy的廣播機制

numpy中兩個陣列之間支援加、減、乘、除等算術運算,實際上是對應位置的元素之間的運算。兩個形狀相同的陣列間執行運算容易理解,兩個形狀不同的陣列之間有時也能執行算術運算,此時會對陣列進行擴充套件,使其形狀相同,然後再執行算術運算,這種機制叫做廣播。但並不是所有的陣列之間都能執行算術運算。

廣播的原則:如果兩個陣列的後緣維度(trailing dimension,即從末尾開始算起的維度)的軸長度相符,或其中的一方的長度為1,則認為它們是廣播相容的。廣播會在缺失或長度為1的維度上進行。廣播效果如圖所示。

此外,多維陣列還可以和標量進行運算,此時會將該標量和陣列中的每一個元素執行運算,並將結果進行儲存。舉例如下:

對陣列中的切片進行賦值時,也會根據廣播機制,將值傳到相應的位置上。這一點和Python中的序列有所不同。

陣列間的集合運算

兩個一維陣列之間還可以執行常見的集合運算,例如求交集並集異或集等,結果中如果包含重複資料會自動刪除多餘的資料

  • np.intersect1d(a,b):交集,結果為同時在a和b中的元素組成的陣列

  • np.setdiff1d(a,b):差集,結果為在a中不在b中的元素組成的陣列;

  • np.union1d(a,b):並集,結果為在a或b中的元素組成的陣列;

  • np.setxor1d(a,b):異或集,結果為在a或b中,但不同時在a和b中的元素組成的陣列;

  • np.in1d(a,b):判斷a中的元素是否在b中,結果為布林型別陣列

陣列的連線

  • np.concatenate((a,b))沿指定軸連線兩個或多個數組,要求指定軸上的元素個數相同,預設是按垂直連線,效果和vstack效果相同;

  • np.stack ((a,b))沿新軸連線陣列序列,陣列a和b形狀必須相;

  • np.hstack ((a,b))通過水平堆疊來生成陣列;

  • np.vstack ((a,b))通過垂直堆疊來生成陣列。

陣列的分割

  • np.split()沿特定的軸將陣列分割為子陣列,如果是整數,就用該數平均切分,如果是陣列,為沿軸對應位置切分(左開右閉);

  • np.hsplit()用於水平分割陣列,通過指定要返回的相同形狀的陣列數量來拆分原陣列

  • np.vsplit()沿著垂直軸分割,其分割方式與hsplit用法相同。

更加詳細的介紹可參考“手把手教你學Python(進階篇)”視訊,更多內容歡迎關注微信公眾號:“手把手教你學程式設計”,我們會不定期更新和分享資源。