NumPy 基礎:函數總結


最近重新學習發現,NumPy 中有很多很多的函數,以下根據個人和結合官網對函數的理解,整理了一些關於NumPy 中常用的一些基礎函數。本文僅供參考,如有錯誤請予以批評指正,如需轉載請標記出處。

1 NumPy - 數組生成函數

Numpy 中最常規的就是利用array函數來生成一個新的包含傳遞數據的NumPy 數組。array函數,參數如下:

import numpy as np
array1=np.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
參數 描述
object 傳入的數據,可以使列表(list)、集合(set)、元組(tuple)、字符串(str)等
dtype 數組的所需數據類型,默認爲空,可選,如:dtype=np.float64
copy 對象是否需要複製,默認爲True
oder C(按行)、F(按列)、A(任意,默認)
subok 默認情況下,返回的數組被強制爲基類數組。 如果爲True,則返回子類
ndmin 指定返回數組的維數,如ndmin=2

除了array函數以外,還有以下一些生成函數,只是參數或多或少發生改變:

生成函數 描述
array 傳入的數據x(可以是列表、集合、元組、字符串等)轉換爲ndarray,具體參數如上表
asarray array和asarray作用相同,但是主要區別就是當數據源是ndarray時,array仍然會copy出一個副本,佔用新的內存,但asarray不會。numpy.asarray(a, dtype=None, order=None)
empty 它創建指定形狀和dtype的未初始化數組。 它使用以下構造函數:numpy.empty(shape, dtype = float, order = 'C')
zeros 返回特定大小,以 0 填充的新數組: numpy.zeros(shape, dtype = float, order = 'C')
ones 返回特定大小,以 1 填充的新數組: numpy.ones(shape, dtype = None, order = 'C')
eye 創建一個N * N的單位矩陣(對角線爲1,其餘爲0): numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
arange 這個函數返回ndarray對象,包含給定範圍內的等間隔值:numpy.arange(start, stop, step, dtype)
linspace 此函數類似於arange()函數。 在此函數中,指定了範圍之間的均勻間隔數量,而不是步長。 此函數的用法如下:numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
logspace 此函數返回一個ndarray對象,其中包含在對數刻度上均勻分佈的數字。 刻度的開始和結束端點是某個底數的冪,通常爲 10:numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

*注:

  1. shape 空數組的形狀,整數或整數元組;
  2. dtype 所需的輸出數組類型,可選;
  3. order 'C’爲按行的 C 風格數組,'F’爲按列的order 'C’爲按行的 C 風格數組,'F’爲按列的Fortran 風格數組;
  4. start 序列的起始值;stop 序列的終止值,如果endpointtrue,該值包含於序列中;
  5. num 要生成的等間隔樣例數量,默認爲50;
  6. retstep 如果爲true,返回樣例,以及連續數字之間的步長;
  7. base 對數空間的底數,默認爲10*

例如:

import numpy as np
ndarray = np.empty((4,4))
print("4x4主對角爲1的empty矩陣")
print(ndarray)

ndarray1 = np.ones((4,4))
print("4x4元素全爲1矩陣")
print(ndarray1)

ndarray2 = np.zeros((4,4))
print("4x4元素全爲0矩陣")
print(ndarray2)

ndarray3 = np.eye(4)
print("4x4單位矩陣")
print(ndarray3)

ndarray4 = np.linspace(0,100,num=11)
print("0-100,生成11個數")
print(ndarray4)

ndarray5 = np.logspace(0,100,num=11)
print("0-100,生成11個對數")
print(ndarray5)

輸出:

4x4主對角爲1的empty矩陣
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
4x4元素全爲1矩陣
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
4x4元素全爲0矩陣
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
4x4單位矩陣
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
0-100,生成11個數
[  0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100.]
0-100,生成11個對數
[1.e+000 1.e+010 1.e+020 1.e+030 1.e+040 1.e+050 1.e+060 1.e+070 1.e+080
 1.e+090 1.e+100]

2 NumPy - 數組的一些基本屬性

NumPy 數組的維數稱爲秩(rank),秩就是軸的數量,即數組的維度,一維數組的秩爲 1,二維數組的秩爲 2,以此類推。

import numpy as np

#生成一個5*5的單位矩陣
ndarray = np.ones((5,5))
#輸出數組 ndarray 的維度
print(ndarray.shape)
#輸出數組 ndarray 的總個數
print(ndarray.size)
#輸出數組 ndarray 中每個元素的大小
print(ndarray.itemsize)

輸出結果爲:

(5, 5)
25
8

NumPy 的數組中比較重要 ndarray 對象屬性有:

函數 描述
ndarray.ndim 秩,即軸的數量或維度的數量
ndarray.shape 數組的維度,對於矩陣,n 行 m 列
ndarray.size 數組元素的總個數,相當於 .shape 中 n*m 的值
ndarray.dtype ndarray 對象的元素類型
ndarray.itemsize ndarray 對象中每個元素的大小,以字節爲單位
ndarray.flags ndarray 對象的內存信息
ndarray.real ndarray元素的實部
ndarray.imag ndarray 元素的虛部
ndarray.data 包含實際數組元素的緩衝區,由於一般通過數組的索引獲取元素,所以通常不需要使用這個屬性。

3 NumPy - 修改數組的形狀

函數 描述
ndarray.reshape 在不改變數據的條件下修改形狀,格式如下: ndarray.reshape(shape, order='C')或者numpy.reshape(arr, newshape, order='C')
ndarray.flat 將數組轉換爲1-D的迭代器ndarray.flat
ndarray.flatten 將多維數組將爲一維數組,返回一份數組拷貝,對拷貝所做的修改不會影響原始數組ndarray.flatten(order='C')
numpy.ravel 將多維數組將爲一維數組,返回的是視圖修改會影響原始數組,numpy.ravel(a, order='C')

例如:

import numpy as np
ndarray = np.ones((4,4))
print(ndarray)
print(ndarray.shape)
ndarray1 = ndarray.reshape(2,8)
print(ndarray1)
print(ndarray1.shape)
print(ndarray.flatten())

輸出結果爲:

[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
(4, 4)
[[1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1.]]
(2, 8)
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

4 NumPy - 數組元素的添加/刪除

函數 描述
resize 返回指定形狀的新數組,如果新數組大小大於原始大小,則包含原始數組中的元素的副本。:numpy.resize(arr, shape)
append 將值添加到數組末尾,輸入數組的維度必須匹配否則將生成ValueError。numpy.append(arr, values, axis=None)
insert 沿指定軸將值插入到指定下標之前。numpy.insert(arr, obj, values, axis)
delete 刪掉某個軸的子數組,並返回刪除後的新數組。Numpy.delete(arr, obj, axis)
unique 查找數組內的唯一元素,函數用於去除數組中的重複元素:numpy.unique(arr, return_index, return_inverse, return_counts)
  • 注:axis:默認爲 None。當axis無定義時,是橫向加成,返回總是爲一維數組!當axis有定義的時候,分別爲0和1的時候。當axis有定義的時候,分別爲0和1的時候(列數要相同)。當axis爲1時,數組是加在右邊(行數要相同)

例如:

import numpy as np
ndarray2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(ndarray2)
print("----------------")
ndarray3 = np.resize(ndarray2,(4,3))
print(ndarray3)
print("----------------")
ndarray4 = np.append(ndarray2,[0,0,0])
ndarray5 = np.append(ndarray2,[[0,0,0]],axis=0)
print(ndarray4)
print("----------------")
print(ndarray5)
ndarray6 = np.delete(ndarray2,2,axis=0)
print("----------------")
print(ndarray6)

輸出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
----------------
[[1 2 3]
 [4 5 6]
 [7 8 9]
 [1 2 3]]
----------------
[1 2 3 4 5 6 7 8 9 0 0 0]
----------------
[[1 2 3]
 [4 5 6]
 [7 8 9]
 [0 0 0]]
----------------
[[1 2 3]
 [4 5 6]]

5 NumPy - 數組的連接/分割函數

NumPy 中的數組連接和分割函數,Python 和本身並無太大差別,以下簡單示例。

函數 描述
concatenate 函數用於沿指定軸連接相同形狀的兩個或多個數組。 該函數接受以下參數:numpy.concatenate((a1, a2, ...), axis=0)
stack 此函數將相同形狀的數組序列,沿指定軸來堆疊。numpy.stack(arrays, axis=0)
hstack stack函數的變體,通過堆疊來生成水平的單個數組。
vstack stack函數的變體,通過堆疊來生成豎直的單個數組。
split 該函數沿特定的軸將數組分割爲子數組。函數接受三個參數:numpy.split(ary, indices_or_sections, axis=0)
hsplit hsplit是split()函數的特例,其中軸爲 1 表示水平分割,無論輸入數組的維度是什麼。numpy.hsplit(ary, indices_or_sections)
vsplit vsplit是split()函數的特例,其中軸爲 0 表示豎直分割,無論輸入數組的維度是什麼。numpy.vsplit(ary, indices_or_sections)

*注:
indices_or_sections:可以是整數,表明要從輸入數組創建的,等大小的子數組的數量。 如果此參數是一維數組,則其元素表明要創建新子數組的點。

例如:

import numpy as np

ndarray1 = np.ones((4,4))
print("4x4元素全爲1矩陣")
print(ndarray1)

ndarray2 = np.zeros((4,4))
print("4x4元素全爲0矩陣")
print(ndarray2)

ndarray3 = np.eye(4)
print("4x4單位矩陣")
print(ndarray3)

ndarray_concatenate = np.concatenate((ndarray1,ndarray2),axis=0)
print("沿指定軸連接")
print(ndarray_concatenate)

ndarray_stack = np.stack((ndarray1,ndarray2),axis=0)
print("沿指定軸堆疊")
print(ndarray_stack)
print("堆疊後的維度是不同的")
print(ndarray_stack.shape)

ndarray_split = np.split(ndarray_concatenate,indices_or_sections=8, axis=0)
print("沿特定的軸將數組分割爲子數組")
print(ndarray_split)

輸出:

4x4元素全爲1矩陣
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
4x4元素全爲0矩陣
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
4x4單位矩陣
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
沿指定軸連接
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
沿指定軸堆疊
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]]
堆疊後的維度是不同的
(2, 4, 4)
沿特定的軸將數組分割爲子數組
[array([[1., 1., 1., 1.]]), array([[1., 1., 1., 1.]]), array([[1., 1., 1., 1.]]), array([[1., 1., 1., 1.]]), array([[0., 0., 0., 0.]]), array([[0., 0., 0., 0.]]), array([[0., 0., 0., 0.]]), array([[0., 0., 0., 0.]])]

6 NumPy - 通用函數

通用函數(即ufunc)是一種對ndarray中的數據執行元素級運算的函數。你可以將其看做簡單函數(接受一個或多個標量值,併產生一個或多個標量值)的矢量化包裝器。

一元通用函數

一元通用函數只接受一個數組,並返回一個結果數組。

函數 描述
abs(x)、fabs(x) 計算數組各元素的絕對值
sqrt(x) 計算數組各元素的平方根
square(x) 計算數組各元素的平方
exp(x) 計算各元素的自然指數值e^x
sign(x) 計算各元素的符號值:1(正)、0(0)、-1(負)
ceil(x) 計算大於等於給定值的最小整數值
floor(x) 計算大於等於給定值的最大整數值
rint(x) 四捨五入到最近的整數,保留dtype
modf(x) 將數組的小數和整數部分以兩個獨立的數組方式返回
log(x)、log10(x)、log2(x) 計算自然對數、底爲10的log、底爲2的log
isnan(x) 返回一個判斷是否是NaN的bool型數組
isfinite(x) 返回一個判斷是否是無窮的bool型數組
isinf(x) 計算大於等於給定值的最小整數值
cos、cosh、sin、sinh、tan、tanh 普通型和雙曲型三角函數
arccos、arccosh、arcsin、arcsinh、arctan、arctanh 反三角函數和雙曲型反三角函數

例如:

import numpy as np
ndarray = np.array([[1,2,3],[4,5,6],[7,8,9]])
print("生成一個3x3的矩陣:")
print(ndarray)

ndarray_sqrt = np.sqrt(ndarray)
print("平方根:")
print(ndarray_sqrt)

ndarray_exp = np.exp(ndarray)
print("指數:")
print(ndarray_exp)

ndarray_log = np.log10(ndarray)
print("10爲底的對數:")
print(ndarray_log)

ndarray_tan = np.tan(ndarray)
print("正切:")
print(ndarray_tan)

輸出:

生成一個3x3的矩陣:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
平方根:
[[1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974]
 [2.64575131 2.82842712 3.        ]]
指數:
[[2.71828183e+00 7.38905610e+00 2.00855369e+01]
 [5.45981500e+01 1.48413159e+02 4.03428793e+02]
 [1.09663316e+03 2.98095799e+03 8.10308393e+03]]
10爲底的對數:
[[0.         0.30103    0.47712125]
 [0.60205999 0.69897    0.77815125]
 [0.84509804 0.90308999 0.95424251]]
正切:
[[ 1.55740772 -2.18503986 -0.14254654]
 [ 1.15782128 -3.38051501 -0.29100619]
 [ 0.87144798 -6.79971146 -0.45231566]]

二元通用函數

二元通用函數接受兩個數組,並返回一個結果數組。

函數 描述
add(x,y) 數組的對應元素相加x+y
subtract(x,y) 數組的對應元素相減x-y
multiply(x,y) 數組的對應元素相乘x*y
divide(x,y) 數組的對應元素相除x/y
floor_divide(x,y) 數組的對應元素整除(捨去餘數)
power(x,y) 次方(以x爲準,y的次方)
mod(x,y) 求模(取餘數)
maximum(x,y),minimun(x,y) 求最大值,最小值
fmax(x,y),fmin(x,y) 求最大值,最小值(忽略NaN)
copysign(x,y) 修改符號,將x的符號值改爲y的符號值
greater、greater_equal、less、less_equal、equal、not_equal 同>、>=、<、<=、==、!=

7 NumPy - 字符串函數

以下函數用於對dtypenumpy.string_numpy.unicode_的數組執行向量化字符串操作。 它們基於 Python 內置庫中的標準字符串函數。

函數 描述
numpy.char.add() 函數執行按元素的字符串連接。
numpy.char.multiply() 返回按元素多重連接後的字符串
numpy.char.center() 此函數返回所需寬度的數組,以便輸入字符串位於中心,並使用fillchar在左側和右側進行填充。
umpy.char.capitalize() 函數返回字符串的副本,其中第一個字母大寫
numpy.char.title() 返回輸入字符串的按元素標題轉換版本,其中每個單詞的首字母都大寫。
numpy.char.lower() 函數返回一個數組,其元素轉換爲小寫。它對每個元素調用str.lower。
numpy.char.upper() 函數返回一個數組,其元素轉換爲大寫。它對每個元素調用str.upper。
numpy.char.split() 函數返回輸入字符串中的單詞列表。 默認情況下,空格用作分隔符。 否則,指定的分隔符字符用於分割字符串(sep)。
numpy.char.splitlines() 函數返回數組中元素的單詞列表,以換行符分割。
numpy.char.strip() 函數返回數組的副本,其中元素移除了開頭或結尾處的特定字符。
numpy.char.join() 這個函數返回一個字符串,其中單個字符由特定的分隔符連接。
numpy.char.replace() 函數返回字符串副本,其中所有字符序列的出現位置都被另一個給定的字符序列取代。
numpy.char.decode() 這個函數在給定的字符串中使用特定編碼調用str.decode()
numpy.char.encode() 函數對數組中的每個元素調用str.encode函數。 默認編碼是utf_8,可以使用標準 Python 庫中的編解碼器。

8 NumPy - 排序函數

函數 描述
sort sort()函數返回一個新數組,不改變原始數組(類似於python中自帶的sorted函數,但numpy中沒有sorted函數,參數也不一樣)。 它有以下參數:numpy.sort(a, axis=1, kind='quicksort', order=None)
argsort 函數對輸入數組沿給定軸執行間接排序。numpy.argsort(a, axis=1, kind='quicksort', order=None)
lexsort 函數使用鍵序列執行間接排序。numpy.argsort(a, axis=-1, kind='quicksort', order=None)

9 NumPy - 統計函數

NumPy 有很多有用的統計函數,用於從數組中給定的元素中查找最小,最大,百分標準差和方差等。

函數 描述
amin、amax 這些函數從給定數組中的元素沿指定軸返回最小值和最大值。amax(a, axis=None)
sum 求和。sum(a, axis=None, dtype=None)
cumsum 從0開始元素累積和。cumsum(a, axis=None, dtype=None)
cumprod 從1開始元素累積積 cumprod(a, axis=None, dtype=None)
ptp 函數返回沿軸的值的範圍(最大值 - 最小值)。 ptp(a, axis=None)
percentile 百分位數是統計中使用的度量,表示小於這個值得觀察值佔某個百分比。percentile(a, q, axis=None)
median 中位數。median(a, axis=None)
mean 函數返回數組中元素的算術平均值。mean(a, axis=None, dtype=None)
average 函數根據在另一個數組中給出的各自的權重計算數組中元素的加權平均值。verage(a, axis=None, weights=None, returned=False)
std 標準差。std(a, axis=None, dtype=None)
var 方差。var(a, axis=None, dtype=None)

10 NumPy - 線性代數

NumPy 包包含numpy.linalg模塊,提供線性代數所需的所有功能。 此模塊中的一些重要功能如下表所述。

函數 描述
numpy.linalg.det() 計算矩陣的行列式
numpy.linalg.eig() 計算方陣的特徵值和特徵向量
numpy.linalg.inv() 計算方陣的逆,它乘以原始矩陣,則得到單位矩陣。
numpy.linalg.pinv() 計算方陣的Moore-Penrose僞逆
numpy.linalg.qr() 計算QR分解
numpy.linalg.svd() 算奇異值分解(SVD)
numpy.linalg.solve(a,b) 求解x的線性方程組Ax = b,其中A爲方陣
numpy.linalg.lstsq(lstsq(a, b, rcond='warn')) 計算Ax=b的最小二乘解

11 NumPy - 僞隨機數生成函數

設置隨機種子

import numpy as np
np.random.seed(1234)#設置隨機種子爲1234

簡單隨機數

函數 描述
rand(d0, d1, …, dn) 產生均勻分佈的隨機數。dn爲第n維數據的維度
randn(d0, d1, …, dn) 產生標準正態分佈隨機數。dn爲第n維數據的維度
randint(low[, high, size, dtype]) 產生隨機整數。low:最小值;high:最大值;size:數據個數
random([size]) 在[0,1)內產生隨機數。size:隨機數的shape,可以爲元祖或者列表,[2,3]表示2維隨機數,維度爲(2,3)
choice(a[, size, replace, p]) 從a中隨機選擇指定數據。a:1維數組 size:返回數據形狀
bytes(length) 返回隨機位。length:位的長度

隨機分佈

函數 描述
beta(a, b[, size]) 貝塔分佈樣本,在 [0, 1]內。
binomial(n, p[, size]) 二項分佈的樣本。
chisquare(df[, size]) 卡方分佈樣本。
dirichlet(alpha[, size]) 狄利克雷分佈樣本。
exponential([scale, size]) 指數分佈
f(dfnum, dfden[, size]) F分佈樣本。
gamma(shape[, scale, size]) 伽馬分佈
geometric(p[, size]) 幾何分佈
gumbel([loc, scale, size]) 耿貝爾分佈。
hypergeometric(ngood, nbad, nsample[, size]) 超幾何分佈樣本。
laplace([loc, scale, size]) 拉普拉斯或雙指數分佈樣本
logistic([loc, scale, size]) Logistic分佈樣本
lognormal([mean, sigma, size]) 對數正態分佈
logseries(p[, size]) 對數級數分佈。
multinomial(n, pvals[, size]) 多項分佈
multivariate_normal(mean, cov[, size]) 多元正態分佈。
negative_binomial(n, p[, size]) 負二項分佈
noncentral_chisquare(df, nonc[, size]) 非中心卡方分佈
noncentral_f(dfnum, dfden, nonc[, size]) 非中心F分佈
normal([loc, scale, size]) 正態(高斯)分佈
pareto(a[, size]) 帕累託(Lomax)分佈
poisson([lam, size]) 泊松分佈
standard_cauchy([size]) 標準柯西分佈
standard_exponential([size]) 標準的指數分佈
standard_gamma(shape[, size]) 標準伽馬分佈
standard_normal([size]) 標準正態分佈 (mean=0, stdev=1).
triangular(left, mode, right[, size]) 三角形分佈
uniform([low, high, size]) 均勻分佈
wald(mean, scale[, size]) 瓦爾德(逆高斯)分佈
weibull(a[, size]) Weibull 分佈
zipf(a[, size]) 齊普夫分佈

排列

函數 描述
shuffle(x) 打亂對象x(多維矩陣按照第一維打亂)
permutation(x) 打亂並返回該對象(多維矩陣按照第一維打亂)

於 2019-12-25 再次更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章