Numpy 的統(tǒng)計函數(shù)
NumPy 提供了很多統(tǒng)計函數(shù),例如對數(shù)組求和、用于從數(shù)組中查找最小元素,最大元素,百分位標(biāo)準(zhǔn)差和方差等。
常用的統(tǒng)計函數(shù)如下:
函數(shù) | 說明 |
---|---|
sum | 對數(shù)組中的全部或沿著軸向的元素求和。 |
mean、median | 求數(shù)組的算術(shù)平均值、中位數(shù) |
std、var | 分別為標(biāo)準(zhǔn)差和方差 |
min、max | 最小值和最大值 |
argmin、argmax | 分別為最小和最大元素的索引 |
cumsum | 所有元素的累計和 |
cumprod | 所有元素的累計積 |
percentile | 計算數(shù)組的百分比分位數(shù) |
1. 聚合計算
1.1 常用聚合方法舉例
sum、mean、std 等函數(shù),可以實現(xiàn)聚合計算的效果,得到的結(jié)果的通常是零維的。此外,函數(shù)可以通過接收一個axis參數(shù),指定聚合計算的方向,最終結(jié)果是一個少一維的數(shù)組。
案例
生成數(shù)組arr0,并查看:
arr0 = np.arange(16).reshape(4,4)
arr0
out:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
分別對數(shù)組求和、求平均、求中位數(shù)、求方差和標(biāo)準(zhǔn)差:
print("數(shù)組求和結(jié)果為:", np.sum(arr0))
print("數(shù)組求平均結(jié)果為:", np.mean(arr0))
print("數(shù)組求中位數(shù)結(jié)果為:", np.median(arr0))
print("數(shù)組求方差結(jié)果為:", np.var(arr0))
print("數(shù)組求標(biāo)準(zhǔn)差結(jié)果為:", np.std(arr0))
print("數(shù)組求最小值為:", np.min(arr0))
print("數(shù)組求最大值為:", np.max(arr0))
輸出結(jié)果為:
數(shù)組求和結(jié)果為: 120
數(shù)組求平均結(jié)果為: 7.5
數(shù)組求中位數(shù)結(jié)果為: 7.5
數(shù)組求方差結(jié)果為: 21.25
數(shù)組求標(biāo)準(zhǔn)差結(jié)果為: 4.6097722286464435
數(shù)組求最小值為: 0
數(shù)組求最大值為: 15
案例
在進行統(tǒng)計運算的時候,也可以把統(tǒng)計函數(shù)作為數(shù)組的實例方法進行調(diào)用。例如,上述的語法可以改寫成:
print("數(shù)組求和結(jié)果為:", arr0.sum())
print("數(shù)組求平均結(jié)果為:", arr0.mean())
print("數(shù)組求方差結(jié)果為:", arr0.var())
print("數(shù)組求標(biāo)準(zhǔn)差結(jié)果為:", arr0.std())
print("數(shù)組求最小值為:", arr0.min())
print("數(shù)組求最大值為:", arr0.max())
輸出結(jié)果為:
數(shù)組求和結(jié)果為: 120
數(shù)組求平均結(jié)果為: 7.5
數(shù)組求方差結(jié)果為: 21.25
數(shù)組求標(biāo)準(zhǔn)差結(jié)果為: 4.6097722286464435
數(shù)組求最小值為: 0
數(shù)組求最大值為: 15
注意,中位數(shù) median 求解無法用上述方法調(diào)用。
案例
對于二維數(shù)組,最外層的軸(也即垂直方向)記為axis=0,內(nèi)層的軸(也即水平方向)記為axis=1。在調(diào)用統(tǒng)計函數(shù)的時候,可以通過指定axis來明確聚合的方向。
例如,對 arr0 進行統(tǒng)計方法的水平方向聚合:
print("數(shù)組水平方向求和結(jié)果為:", np.sum(arr0, axis=1))
print("數(shù)組水平方向求平均結(jié)果為:", np.mean(arr0, axis=1))
print("數(shù)組水平方向求中位數(shù)結(jié)果為:", np.median(arr0, axis=1))
print("數(shù)組水平方向求方差結(jié)果為:", np.var(arr0, axis=1))
print("數(shù)組水平方向求標(biāo)準(zhǔn)差結(jié)果為:", np.std(arr0, axis=1))
print("數(shù)組水平方向求最小值為:", np.min(arr0, axis=1))
print("數(shù)組水平方向求最大值為:", np.max(arr0, axis=1))
輸出結(jié)果為:
數(shù)組水平方向求和結(jié)果為: [ 6 22 38 54]
數(shù)組水平方向求平均結(jié)果為: [ 1.5 5.5 9.5 13.5]
數(shù)組水平方向求中位數(shù)結(jié)果為: [ 1.5 5.5 9.5 13.5]
數(shù)組水平方向求方差結(jié)果為: [1.25 1.25 1.25 1.25]
數(shù)組水平方向求標(biāo)準(zhǔn)差結(jié)果為: [1.11803399 1.11803399 1.11803399 1.11803399]
數(shù)組水平方向求最小值為: [ 0 4 8 12]
數(shù)組水平方向求最大值為: [ 3 7 11 15]
同樣地,實例調(diào)用方法也可以實現(xiàn)上述效果:
print("數(shù)組垂直方向求和結(jié)果為:", arr0.sum(axis=1))
輸出結(jié)果為:
數(shù)組垂直方向求和結(jié)果為: [24 28 32 36]
2. 其他函數(shù)運算
2.1 累計和、累計積
cumsum 和 cumprod 則不聚合,而是產(chǎn)生一個由中間結(jié)果組成的數(shù)組。
案例
計算 arr0 的累計和:
np.cumsum(arr0)
輸出結(jié)果為:
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78,
91, 105, 120], dtype=int32)
可以看出,如果不指定方向,則會把數(shù)組展開為一維數(shù)組并進行累計運算。
案例
分別計算水平方向的累計和和垂直方向的累計積:
print("計算水平方向的累計和", arr0.cumsum(axis=1))
print("計算垂直方向的累計積", arr0.cumprod(axis=0))
輸出結(jié)果為:
計算水平方向的累計和 [[ 0 1 3 6]
[ 4 9 15 22]
[ 8 17 27 38]
[12 25 39 54]]
計算垂直方向的累計積 [[ 0 1 2 3]
[ 0 5 12 21]
[ 0 45 120 231]
[ 0 585 1680 3465]]
2.2 計算百分位數(shù)
百分位數(shù)是統(tǒng)計中使用的度量,表示小于這個值的觀察值的百分比。 函數(shù) numpy.percentile() 接受以下參數(shù)。
numpy.percentile(a, q, axis)
參數(shù)說明:
參數(shù) | 說明 |
---|---|
a | 輸入數(shù)組 |
q | 要計算的百分位數(shù),在 0 ~ 100 之間 |
axis | 沿著它計算百分位數(shù)的軸 |
首先明確百分位數(shù) P 的概念
第 p 個百分位數(shù)是這樣一個值,它使得至少有 p% 的數(shù)據(jù)項小于或等于這個值,且至少有 (100-p)% 的數(shù)據(jù)項大于或等于這個值。
案例
對數(shù)組 arr0 水平方向的中位數(shù)(百分之五十分位數(shù)),也可以按照如下寫法:
np.percentile(arr0, 50, axis=1)
輸出結(jié)果為:
array([ 1.5, 5.5, 9.5, 13.5])
3. 小結(jié)
本節(jié)介紹了常用的統(tǒng)計函數(shù)。在對部分統(tǒng)計函數(shù)進行調(diào)用,除了以函數(shù)的方法,也可以以數(shù)組實例方法調(diào)用。特別地,可以通過指定 axis 的值,來規(guī)定統(tǒng)計計算的方向。
NumPy 提供了很多統(tǒng)計函數(shù),例如對數(shù)組求和、用于從數(shù)組中查找最小元素,最大元素,百分位標(biāo)準(zhǔn)差和方差等。