NumPy學習筆記
- 2021 年 12 月 29 日
- 筆記
歡迎訪問我的GitHub
//github.com/zq2599/blog_demos
內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
本篇概覽
- 欣宸是個Java程式設計師,最近正在學習Python,本文記錄了NumPy庫的學習過程,主要用途是作為筆記來總結和溫習,另外如果您也是一位初學者,希望本文能給您一些參考;
關於NumPy
- NumPy是Python的一個擴展程式庫,支援多維度數組與矩陣計算,並且對數組運算提供了大量的數學函數庫;
- 今天,咱們就通過實戰來了解NumPy最常用的一些功能;
版本
作業系統:macOS Big Sur (11.6)
Anaconda3:2021.05
python:3.7.3
Jupyter Notebook:5.7.8
常規
import numpy as py
print(py.__version__)
- 結果如下:
- 用於生成array的數據源中如果有多種類型的元素,轉成NumPy數組的時候,會統一成精度更高的元素
- NumPy數組有個dtype屬性,用來描述數組中每個元素的類型:
- 還可以強轉:
- 對於嵌套列表,轉為NumPy數組後就是高維數組:
- 可以用NumPy的arange生成數組(注意是列表不是迭代器),arange的四個入參分別是:起始、截止、步長、類型:
- 如果知道了起始和截止值,以及均分的數量,那麼arange就不合適了,因為它只知道間隔,不知道總數,此時用linspace方法更合適:
- 上述linspace方法的結果是左閉右閉區間,可以增加endpoint=False屬性,將結果改成左閉右開區間,此時的其實就是均分成七份,返回前六個元素:
- zero方法也常用到,下面是生成3*4的二維數組,元素值全是零,注意參數是元組:
- 如果您覺得元組和括弧和函數的括弧放在一起不好理解,也可以用以下方式,既shape參數,這是個數組:
- ones方法,看名字就知道和zeros方法的區別和相似指出了:構建元素值全是1的數組:
- zeros_like方法,入參是數組,作用是構造新數組,類型和尺寸都參考入參數組的:
- 有zeros_like,就會有類似的ones_like:
-
類似的還有empty_like,不過它生成的都是未初始化的元素
-
還有個使用的方法full_like,可以指定初始化的值:
- 幾個與維度相關的欄位和方法:
- 三位數組:假設已有二維數組是35的形狀,現在變成三維的,也就是兩個35的二維數組,形狀參數就是(2,3,5)那麼寫法如下:
- NumPy數組支援加號操作,結果是數組中每個元素相加:
- 還可以做平方運算:
- dot方法是點乘,既a的行與b的列,每個元素相乘後再相加,得到的值就是新矩陣的一個元素:
- 除了用數組的dot做點乘,還可以將兩個矩陣對象直接相乘,結果與dot結果一致:
- 另外還要有逆矩陣、轉置矩陣、矩陣轉數組的成員變數需要注意:
愛因斯坦求和約定
-
這裡不細說愛因斯坦求和約定本身,只聊聊NumPy對該約定的支援,主要是einsum方法的使用:
-
如下圖,表達式i->,箭頭左側只有一個字母,表示輸入是一維,箭頭右側空空如也,表示降到0維,也就是求和:
- 三維矩陣降為二維矩陣:
- 矩陣轉置:
- 還可以輸入兩個矩陣,做矩陣相乘,注意ij和jk相乘後,變為ik,j維度消失了:
- 上圖的ij,jk->ik改成ij,jk->,既結果是零維,矩陣相乘就變成了內積計算:
關於軸
-
約減,即減少元素的數量,以sum方法為例,例如一個2行2列的二維數組,可以垂直約減,也就是將所有行的同一列相加,最後只剩下一行,也可以水平約減,也就是將所有列的同一行相加,最後只剩一列:
-
min、max、mean等函數也支援axis參數,做類似操作(mean是計算平均值)
數據訪問
- slice:分片參數
- transpose:轉置二維數組
- ravel:展平多維數組,返回值是原值的視圖,修改返回值會導致原值被改
- flatten:展平多維數組,返回值是新的記憶體對象,修改返回值不會影響原值
廣播
-
NumPy的廣播,也叫張量自動擴張,在兩個數組實施運算的時候,如果兩個數組形狀不同,可以擴充較小數組來匹配較大數組的形狀
-
一維數組與單個數字相加的時候,單個數字會被擴充為數組,值就是它自己:
- 例如52數組與51數組相加,5*1的數組就會自動填充一行,內容是自己的第一行:
高級索引
- 一維數組,方括弧中的方括弧,例如a[[3,3,2,1]],裡面的數字代表要取的元素的索引:
- 二維數組,方括弧中的方括弧,例如a[[3,3,2,1]],裡面的數字代表要取的行數:
- 二維數組,[:,[0,0]]表示所有行都訪問,但是列只取兩個:第0列和第0列,要注意的是第一個逗號,它左邊是行資訊,右邊是列資訊:
- 找出符合條件的元素:
堆疊
- 試想兩本書可以怎麼擺放? 水平方向平鋪(水平堆疊hstack)、垂直方向平鋪(垂直堆疊vstack)、兩本書豎起來對齊(深度堆疊dstack),如下圖所示,類似的,數組也可以按照這個思路去堆疊:
- hstack、vstack、dstack這三個方法將兩個數組向上圖的兩本書一樣做堆疊,要注意的是入參是元組:
- 這個圖比較形象,二維數組在深度方向堆疊,形成了三維數組:
- concatenate函數也能實現堆疊功能:
- column_stack:將每個一維數組作為一列,水平堆疊
- row_stack:將每個一維數組作為一行,垂直堆疊
分割
-
與堆疊相對應的是分割:水平分割、垂直分割、深度分割
-
先來看水平分割hsplit,就像切豎著西瓜,西瓜在水平方向被分割成幾段:
- 垂直分割vsplit就像橫著切西瓜,結果是西瓜在垂直方向被分割成幾段:
- 以上的操作也可以共split方法輔以axis參數來實現:
- 深度分割,會在深度的方向切下,假設原有兩個二維數組組成的三維數組,每個都會被水平分割,這樣就變成了四個二維數組,最終成了兩個三維數組,分割的示意圖如下:
- 程式碼如下:
隨機數
- NumPy生成隨機數的方法:
- 至此,NumPy常用功能已經體驗完畢,這只是對NumPy初步的了解,今後還需要更多的編碼才能熟練使用;
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜索「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界…
//github.com/zq2599/blog_demos