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]

四、注意事项

  1. 数据类型
  • 统计函数通常返回浮点数,即使输入为整数:
    python arr = np.array([1, 2, 3], dtype=np.int32) print(np.mean(arr).dtype) # 输出:float64
  1. 无效值处理
  • 包含 nan 的数组需使用 nan 专用函数:
    python arr = np.array([1, np.nan, 3]) print(np.nanmean(arr)) # 输出:2.0(忽略 nan)
  1. 轴(axis)指定
  • 明确指定轴以避免混淆:
    python arr = np.array([[1, 2], [3, 4]]) print(np.sum(arr, axis=0)) # 输出:[4 6](按列)
  1. 性能优化
  • 向量化操作比循环快:
    python arr = np.array([1, 2, 3]) print(np.sum(arr)) # 高效
  1. 空数组
  • 空数组可能导致错误或无效结果:
    python arr = np.array([]) # np.mean(arr) # 报错:空数组

五、最佳实践

  1. 向量化优先
  • 使用统计函数避免循环:
    python arr = np.array([1, 2, 3]) print(np.mean(arr)) # 高效
  1. 处理无效值
  • 使用 nanmeannanstd 等处理 nan
    python arr = np.array([1, np.nan, 3]) print(np.nanmean(arr))
  1. 显式轴指定
  • 明确 axis 确保结果正确:
    python arr = np.array([[1, 2], [3, 4]]) print(np.std(arr, axis=1))
  1. 优化内存
  • 使用 out 参数复用数组:
    python result = np.empty(2) np.mean(arr, axis=0, out=result)
  1. 结合其他库
  • 与 Pandas 集成:
    python import pandas as pd df = pd.DataFrame(arr) print(df.mean(axis=0))
  1. 调试输出
  • 控制显示精度:
    python np.set_printoptions(precision=2)

六、总结

NumPy 的统计函数(如 summeanstdmaxcumsum)提供了高效的向量化统计计算,支持多维数组和按轴操作。掌握这些函数,理解轴、数据类型和无效值处理,结合最佳实践(如向量化、处理 nan、优化内存),能高效完成数据分析任务。注意形状兼容性和性能优化,确保代码的正确性和效率。

如果你需要更复杂的统计函数示例(如多维分析、性能优化)或特定场景的代码,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注