文章目錄
最近重新學習發現,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) |
*注:
shape
空數組的形狀,整數或整數元組;dtype
所需的輸出數組類型,可選;order
'C’爲按行的 C 風格數組,'F’爲按列的order
'C’爲按行的 C 風格數組,'F’爲按列的Fortran 風格數組;start
序列的起始值;stop
序列的終止值,如果endpoint
爲true
,該值包含於序列中;num
要生成的等間隔樣例數量,默認爲50;retstep
如果爲true
,返回樣例,以及連續數字之間的步長;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 - 字符串函數
以下函數用於對dtype
爲numpy.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 再次更新