Python中Numpy函式詳解

konglingbin發表於2024-03-25

NumPy 是一個 Python 包。 它代表 “Numeric Python”。 它是一個由多維陣列物件和用於處理陣列的例程集合組成的庫。

Numeric,即 NumPy 的前身,是由 Jim Hugunin 開發的。 也開發了另一個包 Numarray ,它擁有一些額外的功能。 2005年,Travis Oliphant 透過將 Numarray 的功能整合到 Numeric 包中來建立 NumPy 包。 這個開源專案有很多貢獻者。

學Python的同學應該都知道Numpy庫,也知道這個庫在機器學習領域是必不可少的庫,這裡我為大家整理了Numpy庫的一些常用的函式,方便大家在使用的時候查詢。

Numpy庫函式講解
Numpy資料型別
型別 含義
np.int8 和 np.uint8 整數(-128到127)和 無符號整數(0到255)
np.int16 和 np.uint16 整數(-32768至32767)和 無符號整數(0到65535)
np.int32 和 np.uint32 整數(-2147483648至2147483647)和 無符號整數(0到4294967295)
np.int64 和 np.uint64 整數(-9223372036854775808至9223372036854775807)和 無符號整數(0到18446744073709551615)
np.float16 半精度浮點數(十進位制下小數點後精確到後四位)
np.float32 單精度浮點數(十進位制下小數點後精確到後8位)
np.float64 雙精度浮點數
np.complex64 複數,由兩個32位浮點數(實數和虛陣列成)表示
np.complex128 複數,由兩個64位浮點數(實數和虛陣列成)表示
np.bool_ 布林值,由True和False組成
Numpy的建立
函式 含義
np.array(object, dtype=None,copy=True) odject = []或(),建立一維組。object = [[],[],…] 或((),()…),建立二維陣列。dtype可自選資料型別,不寫系統會自動判斷填寫資料型別。copy預設為True
np.asarray(object,dtype=None) 當np.array(copy = False)兩函式一樣
講解一下np.array中引數copy的用法,文字描述十分麻煩,還是程式碼演示吧

import numpy as np
a = [-1,2,2]
a = np.array(a)
c = np.array(a,copy = False)
a[0] = 100
print('當copy=False')
print('c陣列')
print(c)
print('a陣列')
print(a)
#程式碼執行結果:
當copy=False
c陣列
[100 2 2]
a陣列
[100 2 2]
當copy=True
c陣列
[-1 2 2]
a陣列
[100 2 2]


透過程式碼結果可以看出copy為True和False的區別,也就明白了np.array與np.asarray的區別

函式 含義
建立等差數列 np.arange([start,]stop, [step],[dtype]) 建立一個從start到stop-1,步長為step的陣列,其中start預設為0,step預設為1,stop是必須填寫的引數
建立等差數列 np.linspace(start,stop,[num],[endpoint],[dtype ]) 建立一個從start到stop的等差數列,num為此等差數列的個數,預設50,endpoint預設為True代表數列的最後一項包含stop,反之不包含
特殊值陣列np.zeros(shape, [dtype],) shape為一個數值,建立一個一維的值為0的陣列,shape為元組或列表,建立一個與shape尺寸大小的值為0的陣列。
特殊值陣列np.ones(shape,[dtype]) shape為一個數值,建立一個一維的值為1的陣列,shape為元組或列表,建立一個與shape尺寸大小的值為1的陣列
特殊值陣列np.eye(n,[m],[k],[dtype]) n為陣列的行數。m是輸出的列數,預設為n。k預設為0表示的是主對角線為1,其餘為0,負數越小表示為1的對角線往主對角線的下方走,正數越大表示為1的對角線往主對角線的上方走。
numpy建立隨機陣列
函式 含義
np.random.seed(k) 如果使用相同的k 值,則每次生成的隨機數都相同,如果不設定這個值,則系統根據時間來自己選擇這個值,此時每次生成的隨機數因時間差異而不同。
np.random.random([size]) 在[0,1)區間隨機生成陣列,szie不填寫時只生成一個資料的陣列,size可接收列表或元組,隨機生成和size尺寸大小相同的陣列
np.random.rand(x,x1,x2…) 在[0,1)區間隨機生成符合(x,x1,x2…)尺寸大小形狀的陣列
np.random.randn(x,x1,x2…) 生成符合標準正態分佈的(x,x1,x2…)尺寸大小形狀的陣列
np.random.randint(low, [high], [size], [dtype]) 在[low,high)區間內生成符合size尺寸大小相同的陣列,當引數high不填寫時生成區間為[0,low)的陣列。當shape不填寫時只生成一個資料的陣列
np.random.choice(a,[size],[replace=True],[p]) a為數字,則從[0,a)中隨機抽取數字,a為列表,元組和陣列(必須是一維的)中隨機抽取數字。size不填寫時,只隨機產生一個資料,siz為數字,隨機產生size個資料組成一維陣列,size為列表或元組,則生成與size相同大小尺寸的陣列。replace預設為True,表示可以取相同數字,False表示不可以取相同數字。p與a相對應,表示取陣列a中每個元素的機率,預設為選取每個元素的機率相同。
numpy.random.normal(loc=0.0, scale=1.0, size=None) loc:浮點型資料,分佈的均值(中心)。scale: 浮點型資料,分佈的標準差(寬度)。size:整數或者整陣列成的元組,如果給定size,生成與size尺寸大小相同的陣列。如果size為None(預設值),那麼就會返回一個值。
Numpy陣列的屬性函式
函式 含義
ndim 返回int。表示陣列的維度
shape 返回tuple。表示陣列的尺寸,對於n行m列的矩陣,形狀為(n,m)
size 返回int。表示陣列的元素總數,等於陣列形狀的乘積
dtype 返回type。描述陣列中元素的型別
itemsize 返回int。表示陣列的每個元素的大小(以位元組為單位)
nbytes 返回int。表示陣列佔用的空間
Numpy更改陣列形狀
函式 含義
np.reshape(a, newshape,) 或a.reshape(shape) 兩函式效果相同,np.reshape的引數newshape只能接收列表和元組,但a.reshape不但可以接收列表和元組,引數的每個元素作為單獨的引數傳入.變換後的陣列的元素個數與原來的元素個數相同,否則報錯
np.resize(a,new_shape)或a.reszie() new_shape只能接收列表和元組,a.resize可單個接收,也可接收列表和元組。變換後的陣列的元素個數可以與原陣列的元素個數不同,np.shape可以進行重複填充,a.resize進行0填充。
np.ravel(a)或a.ravel() 將陣列a變為一維陣列
a.flatten() 將陣列a變為一維陣列
np.squeeze(a) 移除元素個數為一的維度
np.transpose(a,axes)或a.transpose() a 為輸入的陣列。axes為元組 或 列表, 如果指定,它必須是包含[0,1,…,N-1]的排列的元組或列表,其中N是a的軸數,返回陣列的第i個軸將與輸入的編號為axes [i]的軸相對應。 axes預設為range(a.ndim)[::-1],這將反轉軸的順序。a.transpose功能與np.transpose一樣,a.transpose可以接收多個數,元組或列表(這個難以理解,建議使用a.shape來檢視使用該函式前後的變化)
np.swapaxes(a, axis1, axis2)或a.swapaxes() 交換axis1和axis2的所代表的兩個軸,axis1和axis2都為整數。a.swapaxes也只能接收兩個整數。切記這兩個函式不能輸入兩個整數的列表或元組
Numpy統計函式
函式 含義
np.sum(a, axis=None)或a.sum(axis = None) 根據給定軸axis計算陣列a相關元素之和,axis整數或元組
np.mean(a, axis=None)或a.mean(axis = None) 根據給定軸axis計算陣列a相關元素的期望,axis整數或元組
np.average(a,axis=None,weights=None) 根據給定軸axis計算陣列a相關元素的加權平均值
np.std(a, axis=None)或a.std(axis = None) 根據給定軸axis計算陣列a相關元素的標準差
np.var(a, axis=None)或a.var(axis = None) 根據給定軸axis計算陣列a相關元素的方差
np.min(a,axis=None)或a.min(axis=None) 計算陣列a中元素的最大值
np.max(a,axis=None)或a.max(axis=None) 計算陣列a中元素的最大值
np.argmin(a,axis=None)或 a.argmin(axis = None) 計算陣列a中元素最小值降為一維後的下標
np.argmax(a,axis=None)或 a.argmax(axis = None) 計算陣列a中元素最大值降為一維後的下標
np.ptp(a,axis=None)或a.ptp(axis = None) 計算陣列a中元素最大值與最小值的差
np.median(a,axis=None)或 a.median(axis = None) 計算陣列a中元素的中位數(中值)
Numpy算數操作
函式 含義
x1+x2或np.add(x1,x2) x1與x2相加,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同
x1-x2或np.subtract(x1,x2) x1減x2,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同
-x或np.negative(x) 取x的負數,x可以為數值也可以為陣列
x1*x2或 np.multiply(x1,x2) x1x與2相乘,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同
x1/x2或np.divide(x1,x2) x1除以x2,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同,x2為零的時候,值為inf(無限大)
x1//x2或 np.floor_divide(x1,x2) x1整除x2,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同
x1**x2或 np.power(x1,x2) x1的x2次方,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同
x1%x1或 np.mod(x1,x2) x1除以x2的餘數,x1與x2可以為數值也可以都為陣列,陣列的時候其shape的尺寸大小要相同
Numpy比較操作
函式 含義
x1==x2或np.equal(x1,x2) 返回布林陣列
x1!=x2或no.not_equal(x1,x2) 返回布林陣列
x1<x2或np.less(x1,x2) 返回布林陣列
x1<=x2或np.less_equal(x1,x2) 返回布林陣列
x1>x2或np.greater(x1,x2) 返回布林陣列
x1>=x2或 np.greater_equal(x1,x2) 返回布林陣列
Numpy的指數,對數,三角函式
三角函式輸入和輸出的是弧度制

函式 含義
np.deg2rad 將角度制化為弧度制
np.rad2deg 將弧度制化為角度制
在使用三角函式的時候我們可以先將角度制化為弧度制,再帶入三角函式。

函式 含義
np.exp 計算指數(e^x)
np.log,np.log10,np.log2,np.log1p 求以e為底,以10為低,以2為低,以(1+x)為底的對數
np.sign 將陣列中的值標籤化,大於0的變成1,等於0的變成0,小於0的變成-1
np.cos,np.sin,np.tan 三角函式
np.arccos,np.arcsin,np.arctan 反三角函式
Numpy取整,四捨五入
函式 含義
np.ceil 朝著無窮大的方向取整,比如5.1會變成6,-6.3會變成-6
np.floor 朝著負無窮大方向取證,比如5.1會變成5,-6.3會變成-7
np.rint(a) 四捨五入取整
np.round(a,decimals=0) 返回四捨五入後的值,decimals為小數點後的位數
np.modf 將整數和小數分隔開來形成兩個陣列
array.astype(‘資料型別’) 轉換陣列array的資料型別
Numpy矩陣運算
函式 含義
np.dot(a,b) a與b進行陣列的行列式相乘
np.linalg.inv(a) 求矩陣a的逆
np.linalg.det(a) 求a的行列式
np.linalg.eig(a) 求a的特徵值和特徵向量
np.linalg.sval(a) 求a的奇異值分解
np.linalg.norm(a, ord=2, axis=None,) ord=1:求一範數,ord=2:求二範數,ord=np.inf:無窮範數,
Numpy陣列合並
函式 含義
np.append(arr, values, axis=None) arr:需要被合併values的陣列。values:合併到陣列arr中的陣列。axis:可選引數,如果axis沒有給出,合併後返回值為一維陣列。axis被填寫,按照axis指定的維度合併(axis填寫時arr和values需有相同的shape的尺寸大小)
np.concatenate(arrays, axis=None) array多個陣列組成的列表或元組。axis填寫後將按照axis指定的維度合併(array中的陣列可以是不同的shape的尺寸大小)
np.stack(arrays, axis=0) array多個陣列組成的列表或元組。axis填寫後將按照axis指定的維度合併(array中的陣列需為相同的shape的尺寸大小)
np.hstack(tup) 橫向合併,tup多個陣列組成的列表或元組。建議使用二維陣列,多維陣列當shape的尺寸大小不同時有時可以合併,有時不可以。
np.vstack(tup) 豎向合併,tup多個陣列組成的列表或元組。
Numpy陣列分割
函式 含義
np.split(ary, indices_or_sections, axis=0) ary:要切分的陣列。indices_or_sections:如果是一個整數,表示將arry切割為改整數份,如果是一個列表或元組(第一個值不要為0),列表值進行切分。axis:沿著哪個維度進行切向,預設為0,橫向切分,1表示豎向切分。
np.hsplit(ary, indices_or_sections) 豎向切分。ary:要切分的陣列。indices_or_sections:如果是一個整數,表示將arry切割為改整數份,如果是一個列表或元組(第一個值不要為0),列表值進行切分。
np.vsplit(ary, indices_or_sections) 橫向切分。ary:要切分的陣列。indices_or_sections:如果是一個整數,表示將arry切割為改整數份,如果是一個列表或元組(第一個值不要為0),列表值進行切分。
Numpy其他函式
函式 含義
np.take(a,indices,axis = None)/a.take() a:要提取的陣列。indices;要提取的值的索引的列表。axis=0:抽取相應索引行的資料。axis=1:抽取相應索引列的資料。axis=None:將陣列轉化為一維資料再進行索引相對應的資料
np.argmax(array, axis=None) /array.argmax(axis=None) array:代表輸入陣列;axis=0:對array取每一列的最大值的索引,axis=1:對array取每一行的最大值的索引。axis=None:j將array轉為一維資料再進行取最大值的索引(axis為1和0所對應的列和行沒有寫錯,它是和別人不同)
np.tensordot講解
np.tensordot函式是對於高維矩陣進行的內積運算,這個內積的過程不好理解,建議從維度上進行理解就好了

np.tensordot(a,b,axes)
1
a,b是要進行內積運算的矩陣
axes是矩陣要運算的維度

1.當axes = n時,n為整數時,代表的是a的後n個維度與b的前n個維度進行內積後,a去掉後n個維度,b去掉前n個維度兩者再結和的維度,看例子:

首先定義兩個矩陣

>>> a = np.random.rand(4,5,3,2)
>>> b = np.random.rand(2,3,5,4)

這裡設定axes = 0時代表沒有維度去掉,故新矩陣維度為(4, 5, 3, 2, 2, 3, 5, 4)
axes = 1的時候運算後的矩陣的大小為去掉了a的後一個維度與b 的前一個維度故新矩陣維度為(4, 5, 3, 3, 5, 4)

>>> print(np.tensordot(a,b,axes = 0).shape)
(4, 5, 3, 2, 2, 3, 5, 4)
>>> print(np.tensordot(a,b,axes = 1).shape)
(4, 5, 3, 3, 5, 4)

這裡是axes = 2的時候,但是a的後2個維度與b的前2各維度不相同,就會報錯

>>> print(np.tensordot(a,b,axes = 2).shape)
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
print(np.tensordot(a,b,axes = 2).shape)
File "<__array_function__ internals>", line 200, in tensordot
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\numeric.py", line 1117, in tensordot
raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum

修改b的維度使得b的前2個維度與a的後2個維度相同,新矩陣的大小為(4, 5, 5, 4)

>>> b = np.random.rand(3,2,5,4)
>>> print(np.tensordot(a,b,axes = 2).shape)
(4, 5, 5, 4)

2.當axes = [m,n],代表a的m維度與b的n維度進行的內積,新的矩陣大小為去掉a的m維b的n維然後再組合
首先我們看一下a,b的各維度的大小

>>> print(a.shape,b.shape)
(4, 5, 3, 2) (3, 2, 5, 4)

接著嘗試內積a的2維b的0維,去掉後可以看見新矩陣的大小為(4, 5, 2, 2, 5, 4)

>>> print(np.tensordot(a,b,axes = [2,0]).shape)
(4, 5, 2, 2, 5, 4)

但是如果想要內積的維度大小不同,會報錯

>>> print(np.tensordot(a,b,axes = [1,1]).shape)
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
print(np.tensordot(a,b,axes = [1,1]).shape)
File "<__array_function__ internals>", line 200, in tensordot
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\numeric.py", line 1117, in tensordot
raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum

3.如果axes接收的是一個巢狀列表的列表:[[m], [n]],等於說可以選多個維度內積 (注意這裡的兩個列表相對應的維度的大小要相同),然後去掉a,b相應的維度,再組合
首先檢視a,b的各維度大小,接著我們這裡想要在大小為5和2的維度上內積,這裡一定要注意兩個列表中維度大小要相同

>>> print(a.shape,b.shape)
(4, 5, 3, 2) (3, 2, 5, 4)
>>> print(np.tensordot(a,b,axes = [[1,3],[2,1]]).shape)
(4, 3, 3, 4)

參考:https://blog.csdn.net/m0_59151709/article/details/129355556

https://blog.csdn.net/jiebaoshayebuhui/article/details/126740304

相關文章