Skip to content

NumPy - 统计函数

NumPy 提供了一套函数,用于对数组数据执行常见的统计计算。这些函数可以作用于整个数组,也可以沿多维数组的指定轴(axis)进行操作。

在使用多维数组进行许多统计计算时,一个关键参数是 axis。它指定了计算应沿哪个轴进行:

  • axis=0: 沿行方向操作(折叠行,结果是每列的值)。
  • axis=1: 沿列方向操作(折叠列,结果是每行的值)。
  • axis=None (默认): 对展平后的数组(所有元素)进行操作。

许多统计函数也可以直接作为 ndarray 对象的方法使用(例如,a.min(),a.mean(axis=0))。

最小值和最大值(numpy.amin,numpy.amax,numpy.ptp)

Section titled “最小值和最大值(numpy.amin,numpy.amax,numpy.ptp)”
  • numpy.amin() 或 ndarray.min(): 查找最小值。
  • numpy.amax() 或 ndarray.max(): 查找最大值。
  • numpy.ptp(): 计算范围(峰峰值 = max - min)。
import numpy as np
a = np.array([[3, 7, 5],
[8, 4, 3],
[2, 4, 9]])
print(f"Our array:\n{a}\n")
# Overall min/max/range
print(f"Overall minimum (np.amin): {np.amin(a)}")
print(f"Overall maximum (a.max()): {a.max()}")
print(f"Overall range (np.ptp): {np.ptp(a)}\n")
# Operations along axes
print(f"Minimum along axis 0 (columns): {np.amin(a, axis=0)}")
print(f"Maximum along axis 1 (rows): {np.amax(a, axis=1)}")
print(f"Range along axis 0 (columns): {np.ptp(a, axis=0)}")
print(f"Range along axis 1 (rows): {np.ptp(a, axis=1)}")

输出:

Our array:
[[3 7 5]
[8 4 3]
[2 4 9]]
Overall minimum (np.amin): 2
Overall maximum (a.max()): 9
Overall range (np.ptp): 7
Minimum along axis 0 (columns): [2 4 3]
Maximum along axis 1 (rows): [7 8 9]
Range along axis 0 (columns): [6 3 6]
Range along axis 1 (rows): [4 5 7]

百分位数和中位数(numpy.percentile,numpy.median)

Section titled “百分位数和中位数(numpy.percentile,numpy.median)”
  • numpy.percentile(a, q, axis=None, ...): 计算数据的第 q 个百分位数。q 必须介于 0 到 100 之间。
  • numpy.median(a, axis=None, ...): 计算中位数(第 50 个百分位数)。

百分位数表示低于该值的观测值占总数给定百分比的值。中位数将数据分为较低的半部分和较高的半部分。

import numpy as np
a = np.array([[30, 40, 70],
[80, 20, 10],
[50, 90, 60]])
print(f"Our array:\n{a}\n")
# Median (50th percentile) overall
print(f"Overall median: {np.median(a)}")
# Also: np.percentile(a, 50)
# 25th percentile (first quartile) along columns
print(f"25th percentile (axis=0): {np.percentile(a, 25, axis=0)}")
# Median along rows
print(f"Median (axis=1): {np.median(a, axis=1)}")

输出:

Our array:
[[30 40 70]
[80 20 10]
[50 90 60]]
Overall median: 50.0
25th percentile (axis=0): [40. 30. 35.]
Median (axis=1): [40. 20. 60.]

均值和平均值(numpy.mean,numpy.average)

Section titled “均值和平均值(numpy.mean,numpy.average)”
  • numpy.mean() 或 ndarray.mean(): 计算算术平均值(平均值)。
  • numpy.average(): 计算加权平均值。如果未提供权重,则等同于 mean。
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]])
print(f"Our array (a):\n{a}\n")
# Calculate the mean
print(f"Overall mean: {np.mean(a)}")
print(f"Mean along axis 0 (columns): {a.mean(axis=0)}")
print(f"Mean along axis 1 (rows): {a.mean(axis=1)}\n")
# Calculate weighted average along rows
weights = np.array([1, 2, 3]) # Weights for columns
# For row 0: (1*1 + 2*2 + 3*3) / (1+2+3) = 14 / 6 = 2.333
# For row 1: (1*4 + 2*5 + 3*6) / (1+2+3) = 32 / 6 = 5.333
print(f"Weights: {weights}")
print(f"Weighted average (axis=1): {np.average(a, axis=1, weights=weights)}")
# Average can also return sum of weights
avg, sum_weights = np.average(a, axis=1, weights=weights, returned=True)
print(f"Weighted avg (returned=True): {avg}")
print(f"Sum of weights (returned=True): {sum_weights}")

输出:

Our array (a):
[[1 2 3]
[4 5 6]]
Overall mean: 3.5
Mean along axis 0 (columns): [2.5 3.5 4.5]
Mean along axis 1 (rows): [2. 5.]
Weights: [1 2 3]
Weighted average (axis=1): [2.33333333 5.33333333]
Weighted avg (returned=True): [2.33333333 5.33333333]
Sum of weights (returned=True): [6. 6.]

方差和标准差(numpy.var,numpy.std)

Section titled “方差和标准差(numpy.var,numpy.std)”
  • numpy.var() 或 ndarray.var(): 计算方差。
  • numpy.std() 或 ndarray.std(): 计算标准差。

方差衡量数据与均值的平均平方偏差。标准差是方差的平方根,提供了与数据具有相同单位的离散度度量。

重要参数:ddof (Delta Degrees of Freedom,自由度差)。默认情况下,ddof=0,计算的是总体方差/标准差。对于样本方差/标准差(除以 N-1 而不是 N),请设置 ddof=1。

import numpy as np
data = np.array([1, 2, 3, 4, 5])
print(f"Data: {data}\n")
# Population variance (ddof=0, default)
var_pop = np.var(data)
std_pop = np.std(data)
print(f"Population Variance (ddof=0): {var_pop}")
print(f"Population Std Dev (ddof=0): {std_pop}\n")
# Sample variance (ddof=1)
var_sample = np.var(data, ddof=1)
std_sample = np.std(data, ddof=1)
print(f"Sample Variance (ddof=1): {var_sample}")
print(f"Sample Std Dev (ddof=1): {std_sample}")

输出:

Data: [1 2 3 4 5]
Population Variance (ddof=0): 2.0
Population Std Dev (ddof=0): 1.4142135623730951
Sample Variance (ddof=1): 2.5
Sample Std Dev (ddof=1): 1.5811388300841898

应用:统计函数对于描述性数据分析、理解数据分布、机器学习中的特征工程以及质量控制至关重要。

在 NumPy 统计文档 中查找更多函数和详细信息。