NumPy 统计函数
在 NumPy 中,统计函数(Statistical Functions)是一组用于分析和处理 ndarray
(N 维数组)数据的工具函数,能够高效计算数组的统计特性,如均值、标准差、总和、最大值、最小值等。这些函数支持向量化操作,适用于数据分析、科学计算和机器学习中的数据预处理和特征提取。以下是对 NumPy 统计函数的详细中文讲解,涵盖定义、常用函数、示例、注意事项及最佳实践,帮助你全面掌握 NumPy 统计函数的使用。
一、NumPy 统计函数概述
1. 什么是统计函数?
- 定义:NumPy 统计函数是对数组元素执行统计计算的通用函数(ufunc),支持按轴(axis)操作和向量化处理。
- 特点:
- 向量化:逐元素或按轴计算,无需显式循环。
- 高效性:基于 C 实现,性能优于 Python 原生循环。
- 多维支持:适用于任意维度的数组。
- 广播兼容:可结合广播机制处理不同形状的数组。
- 用途:
- 数据分析:计算均值、方差、极值等统计量。
- 数据预处理:标准化、归一化、异常值检测。
- 机器学习:特征分析、数据分布检查。
2. 统计函数 vs Python 内置统计模块
特性 | NumPy 统计函数 | Python statistics 模块 |
---|---|---|
输入类型 | 数组(标量、向量、矩阵) | 列表或标量 |
向量化 | 支持数组操作 | 需手动循环 |
多维支持 | 按轴操作 | 不支持多维 |
性能 | 高效(C 实现) | 较慢(Python 实现) |
二、常用 NumPy 统计函数
NumPy 提供了丰富的统计函数,以下按功能分类介绍常用函数及其用法。
1. 基本统计函数
这些函数计算数组的基本统计量,支持按轴操作。
函数 | 描述 | 示例(标量) |
---|---|---|
np.sum(arr, axis=None) | 求和 | sum([1, 2, 3]) = 6 |
np.mean(arr, axis=None) | 均值 | mean([1, 2, 3]) = 2.0 |
np.median(arr, axis=None) | 中位数 | median([1, 2, 3]) = 2.0 |
np.std(arr, axis=None) | 标准差 | std([1, 2, 3]) ≈ 0.82 |
np.var(arr, axis=None) | 方差 | var([1, 2, 3]) ≈ 0.67 |
np.max(arr, axis=None) | 最大值 | max([1, 2, 3]) = 3 |
np.min(arr, axis=None) | 最小值 | min([1, 2, 3]) = 1 |
- 语法:
np.<function>(arr, axis=None, dtype=None, out=None, keepdims=False)
arr
:输入数组。axis
:计算轴(默认None
,对整个数组操作)。dtype
:指定输出数据类型。out
:可选输出数组。keepdims
:是否保留维度。- 示例:
import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(np.sum(arr)) # 输出:10
print(np.mean(arr, axis=0)) # 输出:[2. 3.](按列均值)
print(np.std(arr, axis=1)) # 输出:[0.5 0.5](按行标准差)
print(np.max(arr)) # 输出:4
2. 极值索引
- 函数:
np.argmax(arr, axis=None)
:返回最大值的索引。np.argmin(arr, axis=None)
:返回最小值的索引。- 示例:
arr = np.array([1, 3, 2, 4])
print(np.argmax(arr)) # 输出:3(最大值 4 的索引)
print(np.argmin(arr)) # 输出:0(最小值 1 的索引)
- 多维示例:
arr = np.array([[1, 2], [4, 3]])
print(np.argmax(arr, axis=1)) # 输出:[1 0](每行最大值索引)
3. 累积统计
- 函数:
np.cumsum(arr, axis=None)
:累积和。np.cumprod(arr, axis=None)
:累积积。- 示例:
arr = np.array([1, 2, 3])
print(np.cumsum(arr)) # 输出:[1 3 6]
print(np.cumprod(arr)) # 输出:[1 2 6]
- 多维示例:
arr = np.array([[1, 2], [3, 4]])
print(np.cumsum(arr, axis=0)) # 按列累积
# 输出:
# [[1 2]
# [4 6]]
4. 其他统计函数
- 函数:
np.ptp(arr, axis=None)
:最大值与最小值的差(peak-to-peak)。np.percentile(arr, q, axis=None)
:计算百分位数。np.quantile(arr, q, axis=None)
:计算分位数。- 示例:
arr = np.array([1, 2, 3, 4])
print(np.ptp(arr)) # 输出:3(4 - 1)
print(np.percentile(arr, 50)) # 输出:2.5(50% 分位数)
三、实际应用场景
1. 数据标准化
将数组归一化到零均值和单位方差:
arr = np.array([[1, 2], [3, 4]])
mean = np.mean(arr, axis=0)
std = np.std(arr, axis=0)
normalized = (arr - mean) / std
print(normalized)
# 输出:
# [[-1. -1.]
# [ 1. 1.]]
2. 异常值检测
找出超出标准差范围的元素:
arr = np.array([1, 2, 10, 3, 4])
mean, std = np.mean(arr), np.std(arr)
outliers = arr[np.abs(arr - mean) > 2 * std]
print(outliers) # 输出:[10]
3. 数据分布分析
计算多维数组的统计量:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.median(arr, axis=1)) # 输出:[2. 5.](每行中位数)
4. 时间序列累积
计算累积和:
data = np.array([1, 2, 3, 4])
cumulative = np.cumsum(data)
print(cumulative) # 输出:[1 3 6 10]
四、注意事项
- 数据类型:
- 统计函数通常返回浮点数,即使输入为整数:
python arr = np.array([1, 2, 3], dtype=np.int32) print(np.mean(arr).dtype) # 输出:float64
- 无效值处理:
- 包含
nan
的数组需使用nan
专用函数:python arr = np.array([1, np.nan, 3]) print(np.nanmean(arr)) # 输出:2.0(忽略 nan)
- 轴(axis)指定:
- 明确指定轴以避免混淆:
python arr = np.array([[1, 2], [3, 4]]) print(np.sum(arr, axis=0)) # 输出:[4 6](按列)
- 性能优化:
- 向量化操作比循环快:
python arr = np.array([1, 2, 3]) print(np.sum(arr)) # 高效
- 空数组:
- 空数组可能导致错误或无效结果:
python arr = np.array([]) # np.mean(arr) # 报错:空数组
五、最佳实践
- 向量化优先:
- 使用统计函数避免循环:
python arr = np.array([1, 2, 3]) print(np.mean(arr)) # 高效
- 处理无效值:
- 使用
nanmean
、nanstd
等处理nan
:python arr = np.array([1, np.nan, 3]) print(np.nanmean(arr))
- 显式轴指定:
- 明确
axis
确保结果正确:python arr = np.array([[1, 2], [3, 4]]) print(np.std(arr, axis=1))
- 优化内存:
- 使用
out
参数复用数组:python result = np.empty(2) np.mean(arr, axis=0, out=result)
- 结合其他库:
- 与 Pandas 集成:
python import pandas as pd df = pd.DataFrame(arr) print(df.mean(axis=0))
- 调试输出:
- 控制显示精度:
python np.set_printoptions(precision=2)
六、总结
NumPy 的统计函数(如 sum
、mean
、std
、max
、cumsum
)提供了高效的向量化统计计算,支持多维数组和按轴操作。掌握这些函数,理解轴、数据类型和无效值处理,结合最佳实践(如向量化、处理 nan
、优化内存),能高效完成数据分析任务。注意形状兼容性和性能优化,确保代码的正确性和效率。
如果你需要更复杂的统计函数示例(如多维分析、性能优化)或特定场景的代码,请告诉我!