Numpy 的统计函数
NumPy 提供了很多统计函数,例如对数组求和、用于从数组中查找最小元素,最大元素,百分位标准差和方差等。
常用的统计函数如下:
函数 | 说明 |
---|---|
sum | 对数组中的全部或沿着轴向的元素求和。 |
mean、median | 求数组的算术平均值、中位数 |
std、var | 分别为标准差和方差 |
min、max | 最小值和最大值 |
argmin、argmax | 分别为最小和最大元素的索引 |
cumsum | 所有元素的累计和 |
cumprod | 所有元素的累计积 |
percentile | 计算数组的百分比分位数 |
1. 聚合计算
1.1 常用聚合方法举例
sum、mean、std 等函数,可以实现聚合计算的效果,得到的结果的通常是零维的。此外,函数可以通过接收一个axis参数,指定聚合计算的方向,最终结果是一个少一维的数组。
案例
生成数组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]])
分别对数组求和、求平均、求中位数、求方差和标准差:
print("数组求和结果为:", np.sum(arr0))
print("数组求平均结果为:", np.mean(arr0))
print("数组求中位数结果为:", np.median(arr0))
print("数组求方差结果为:", np.var(arr0))
print("数组求标准差结果为:", np.std(arr0))
print("数组求最小值为:", np.min(arr0))
print("数组求最大值为:", np.max(arr0))
输出结果为:
数组求和结果为: 120
数组求平均结果为: 7.5
数组求中位数结果为: 7.5
数组求方差结果为: 21.25
数组求标准差结果为: 4.6097722286464435
数组求最小值为: 0
数组求最大值为: 15
案例
在进行统计运算的时候,也可以把统计函数作为数组的实例方法进行调用。例如,上述的语法可以改写成:
print("数组求和结果为:", arr0.sum())
print("数组求平均结果为:", arr0.mean())
print("数组求方差结果为:", arr0.var())
print("数组求标准差结果为:", arr0.std())
print("数组求最小值为:", arr0.min())
print("数组求最大值为:", arr0.max())
输出结果为:
数组求和结果为: 120
数组求平均结果为: 7.5
数组求方差结果为: 21.25
数组求标准差结果为: 4.6097722286464435
数组求最小值为: 0
数组求最大值为: 15
注意,中位数 median 求解无法用上述方法调用。
案例
对于二维数组,最外层的轴(也即垂直方向)记为axis=0,内层的轴(也即水平方向)记为axis=1。在调用统计函数的时候,可以通过指定axis来明确聚合的方向。
例如,对 arr0 进行统计方法的水平方向聚合:
print("数组水平方向求和结果为:", np.sum(arr0, axis=1))
print("数组水平方向求平均结果为:", np.mean(arr0, axis=1))
print("数组水平方向求中位数结果为:", np.median(arr0, axis=1))
print("数组水平方向求方差结果为:", np.var(arr0, axis=1))
print("数组水平方向求标准差结果为:", np.std(arr0, axis=1))
print("数组水平方向求最小值为:", np.min(arr0, axis=1))
print("数组水平方向求最大值为:", np.max(arr0, axis=1))
输出结果为:
数组水平方向求和结果为: [ 6 22 38 54]
数组水平方向求平均结果为: [ 1.5 5.5 9.5 13.5]
数组水平方向求中位数结果为: [ 1.5 5.5 9.5 13.5]
数组水平方向求方差结果为: [1.25 1.25 1.25 1.25]
数组水平方向求标准差结果为: [1.11803399 1.11803399 1.11803399 1.11803399]
数组水平方向求最小值为: [ 0 4 8 12]
数组水平方向求最大值为: [ 3 7 11 15]
同样地,实例调用方法也可以实现上述效果:
print("数组垂直方向求和结果为:", arr0.sum(axis=1))
输出结果为:
数组垂直方向求和结果为: [24 28 32 36]
2. 其他函数运算
2.1 累计和、累计积
cumsum 和 cumprod 则不聚合,而是产生一个由中间结果组成的数组。
案例
计算 arr0 的累计和:
np.cumsum(arr0)
输出结果为:
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78,
91, 105, 120], dtype=int32)
可以看出,如果不指定方向,则会把数组展开为一维数组并进行累计运算。
案例
分别计算水平方向的累计和和垂直方向的累计积:
print("计算水平方向的累计和", arr0.cumsum(axis=1))
print("计算垂直方向的累计积", arr0.cumprod(axis=0))
输出结果为:
计算水平方向的累计和 [[ 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 计算百分位数
百分位数是统计中使用的度量,表示小于这个值的观察值的百分比。 函数 numpy.percentile() 接受以下参数。
numpy.percentile(a, q, axis)
参数说明:
参数 | 说明 |
---|---|
a | 输入数组 |
q | 要计算的百分位数,在 0 ~ 100 之间 |
axis | 沿着它计算百分位数的轴 |
首先明确百分位数 P 的概念
第 p 个百分位数是这样一个值,它使得至少有 p% 的数据项小于或等于这个值,且至少有 (100-p)% 的数据项大于或等于这个值。
案例
对数组 arr0 水平方向的中位数(百分之五十分位数),也可以按照如下写法:
np.percentile(arr0, 50, axis=1)
输出结果为:
array([ 1.5, 5.5, 9.5, 13.5])
3. 小结
本节介绍了常用的统计函数。在对部分统计函数进行调用,除了以函数的方法,也可以以数组实例方法调用。特别地,可以通过指定 axis 的值,来规定统计计算的方向。
NumPy 提供了很多统计函数,例如对数组求和、用于从数组中查找最小元素,最大元素,百分位标准差和方差等。