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初步的了解,今後還需要更多的編碼才能熟練使用;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中間件系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜索「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界…
//github.com/zq2599/blog_demos