歡迎訪問我的GitHub
https://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系列
- Spring系列
- Docker系列
- kubernetes系列
- 資料庫+中間件系列
- DevOps系列
歡迎關注公眾號:程式員欣宸
微信搜索「程式員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/396372.html
標籤:Java
