首页 > NumPy 阅读数:39

NumPy常用的统计函数

NumPy 的统计函数可以实现对整个数组或者是沿着数组轴方向的统计计算,常用的统计函数有求最大值和最小值,求和与平均值,计算百分位数、中位数、标准差和方差等。

求最大值和最小值的函数

在 NumPy 中,求数组最大值的函数是 amax() 和 nanmax(),求数组最小值的函数是 amin() 和 nanmin(),其中,amax() 和 amin() 函数用于返回一个数组的最大值和最小值或者是沿轴返回数组的最大值和最小值;nanmax() 函数和 nanmin() 函数用于返回忽略任何 NaN 的数组的最大值和最小值或者是沿轴返回忽略任何 NaN 的数组的最大值和最小值。

如果数组是全 NaN 切片,将会出现运行警告(Runtime Warning),并为该切片返回 NaN。

amax() 函数的格式如下:

numpy.amax(a,[axis=None[,out=None[,keepdims=False]]])

函数中的参数说明如下:
  • a:输入数据;
  • axis:指定沿着某个轴来计算最大值,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组;
  • out:替代输出数组,用于放置结果,默认值为 None;
  • keepdims:默认值为 False,输出行维度为 1,如果设置为 True,则输出列维度为 1。

amax() 函数除了 a 参数外,其余参数为可选项。而 amin()、nanmax()、nanmin() 与 amax() 的函数格式和参数相同。另外,也可以使用 max() 函数和 min() 函数求序列或数组的最大值和最小值。但是对于大型数组而言,使用 amax() 函数和 amin() 函数性能会更好。

最大值和最小值的函数的示例代码 example1 如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.array([[0,3,1,5],[2,4,6,1],[2,8,9,2]])
#求arr数组的最大值
max1 = np.amax(arr)
#求arr数组垂直方向的最大值
max2 = np.amax(arr,axis=0)
#求arr数组水平方向的最大值
max3 = np.amax(arr,axis=1)
max4 = np.max(arr,axis=1)
print(max1,max2,max3,max4)

#amin函数与nanmin函数的区别
arr = np.arange(5, dtype=float)
print(arr)                         # [0. 1. 2. 3. 4.]
arr[3] = np.nan
a = np.amin(arr)
print(a)                           # 用amin函数输出NaN
b = np.nanmin(arr)
print(b)                           #用nanmin函数输出0.0

求沿轴方向的取值范围

在 NumPy 中,使用 ptp() 函数能返回沿某轴(axis)方向上的最大值与最小值的差值,即 maximum-minimum 的值形成的数组。ptp() 函数的格式如下:

numpy.ptp(a,[axis=None[,out=None]])

函数中的参数说明如下:
  • a:输入数据;
  • axis:指定沿着某个轴来计算差值,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组;
  • out:替代输出数组,用于放置结果,默认值为 None。

该函数除了 a 参数外,其余参数为可选项。

ptp() 函数的示例代码 example2 如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.arange(12).reshape((3,4))
a = np.ptp(arr, axis=0)
print(a)                               #[8 8 8 8] 差值形成的数组
b = np.ptp(arr, axis=1)
print(b)                               #[3 3 3]差值形成的数组

求百分位数

在 NumPy 中,使用 percentile() 和 nanpercentile() 函数可以沿某轴(axis)方向计算数组中第 q 数值的百分位数。percentile() 函数的格式如下:

percentile(a,q[, axis, out, …])

函数中的主要参数说明如下:
  • a:数组或可以转化成数组的对象;
  • q:[0,100] 范围的浮点数;
  • axis:指定沿着某个轴来计算百分位数,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组。

percentile() 函数除了 a、q 参数外,其余参数为可选项。percentile() 函数还可以计算多维数组的任意百分比分位数。所谓百分比分位数就是位于 q% 位置处的值,称为第 q 百分位数。但要注意,数列要递增排序后再计算。

nanpercentile() 函数格式与 percentile() 函数格式相同,只是在计算百分位数时会忽略数组中的 NaN 值。

求中位数

在 NumPy 中,利用 median() 和 nanmean() 函数可以沿某轴(axis)方向计算数组中的中位数。median() 函数格式如下:

numpy.median(a[, axis, out, overwrite_input, keepdims])

函数中的主要参数说明如下:
  • a:数组或可以转化成数组的对象;
  • axis:指定沿着某个轴来计算中位数,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组。

median() 函数除了 a 参数外,其余参数为可选项。median() 相当于 percentile() 函数在参数 q=50 时的值。

nanmedian() 函数是计算数组a在沿某轴(axis)方向上忽略 NaN 值的中位数。

求百分位数和中位数的示例代码 example3 如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.arange(12).reshape((3,4))
#使用percentile函数求百分位数
a = np.percentile(arr,50)             #相当于求中位数
b= np.percentile(arr,50, axis=0)      #输出[4. 5. 6. 7.]
c = np.percentile(arr,60 , axis=0)    # 输出[4.8 5.8 6.8 7.8]
print(a,b,c)
#使用median函数求中位数
d = np.median(arr)                    # 输出5.5
e = np.median(arr,axis = 0)           # 输出[4. 5. 6. 7.]
f = np.median(arr,axis = 1)           # 输出[1.5 5.5 9.5]
print(d,e,f)

求和与加权平均值

在 NumPy 中,sum() 函数是沿某轴(axis)方向计算数组中相关元素之和,函数格式如下:

sum(a[, axis=None])


average()函数是沿某轴(axis)方向计算数组中相关元素的加权平均值。加权平均值的数学概念是有 n 个数 X1,X2,…,Xn 的权分别是 W1,W2,…,Wn,那么,这 n 个数的加权平均值为:(X1W1+X2W2+…+XnWn)/(W1+W2+…+Wn)

当每个数对应的权重为 1 时,也就是计算平均数。average() 函数的格式如下:

average(a[, axis=None, weights=None])

函数中的主要参数说明如下:
  • a:输入数组;
  • axis:指定沿着某个轴来计算和或平均值,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组;
  • weights:表示权重值。当权重值为一维数组时,其长度必须与沿指定轴方向的长度一致。另外,权重值数组也可以与 a 数组的形状相同。

sum() 和 average() 函数除了 a 参数外,其余参数为可选项。

求和与加权平均值的示例代码 example4 如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.arange(12).reshape((3,4))
#计算和
a = np.sum(arr)
b = np.sum(arr,axis = 0)
c = np.sum(arr,axis = 1)
print(a,b,c)

#计算权重值为1时的加权平均值
a = np.average(arr)
b = np.average(arr,axis = 0)
c = np.average(arr,axis = 1)
print(a,b,c)

算术平均数

算术平均数是所有元素的总和除以元素的数量。在 NumPy 中,mean() 和 nanmean() 函数可以计算数组或者轴方向的算术平均数,函数格式如下:

mean(a[, axis=None])

函数中的主要参数说明如下:
  • a:输入数组;
  • axis:指定沿着某个轴来计算算术平均数,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组。

mean() 函数除了 a 参数外,其余参数为可选项。nanmean() 函数在计算算术平均数时如果遇到 NaN 值会忽略。

标准差

标准差也称为标准偏差,其定义是总体中各单位标准值与其平均数离差平方的算术平均数的平方根,它反映组内个体间的离散程度。在 NumPy 中,计算标准差的函数有 std() 和 nanstd()。std() 函数的格式如下:

numpy.std(a[, axis=None])

函数中的主要参数说明如下:
  • a:输入数组;
  • axis:指定沿着某个轴来计算标准差,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组。

std() 函数除了 a 参数外,其余参数为可选项。nanstd() 函数在计算标准差时如果遇到 NaN 值会忽略。

方差

方差是元素与元素的平均数差的平方的平均数 mean(abs(x - x.mean())**2)。在 NumPy 中,计算方差的函数有 var() 和 nanvar()。var() 函数的格式如下:

numpy.var(a[, axis=None,dtype=None])

函数中的主要参数说明如下:
  • a:输入数组;
  • axis:指定沿着某个轴来计算方差,axis=0 表示按列,axis=1 表示按行,默认值 None 表示对整个数组;
  • dtype:数据类型。

var() 函数除了 a 参数外,其余参数都为可选项。nanvar() 函数在计算方差时会忽略数组中的 NaN 值。

计算算术平均数、标准差与方差的示例代码 example5 如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.arange(12).reshape((3,4))
#计算算术平均数
a = np.mean(arr)
b = np.mean(arr,axis=0)
c = np.mean(arr,axis=1)
print(a,b,c)

#计算标准差
a = np.std(arr)
b = np.std(arr,axis=0)
c = np.std(arr,axis=1)
print(a,b,c)

#计算方差
a = np.var(arr)
b = np.var(arr,axis=0)
c = np.var(arr,axis=1)
print(a,b,c)