直接用 np.mean() 和 np.var() 计算,注意默认全数组标量结果、axis 参数控制行列方向、ddof=1 得样本方差、NaN 处理用 nanmean/nanvar、避免混用 statistics 模块及手写循环。

用 np.mean() 和 np.var() 直接算,别手写循环
NumPy 的统计函数默认按全数组展开计算,不是按行或列——这是最常被忽略的起点。如果你传入二维数组却没指定 axis,结果是一个标量,而不是每行/每列一个值。
- 想求整个数组的平均值和方差:直接调
np.mean(arr)、np.var(arr) - 想按行算(每行一个均值):加
axis=1,如np.mean(arr, axis=1) - 想按列算(每列一个方差):用
axis=0,如np.var(arr, axis=0) -
np.var()默认算的是「总体方差」(除以 N),不是样本方差(除以 N−1)。要样本方差得加ddof=1:np.var(arr, ddof=1)
方差结果为 0 或 nan?检查数据类型和缺失值
np.var() 对 NaN 敏感,只要数组里有一个 np.nan,结果就是 nan;如果所有值都一样,方差自然为 0——但这不一定是错,得先确认是不是数据本身就没变化。
- 检查是否有
NaN:np.isnan(arr).any() - 忽略
NaN计算:改用np.nanmean()和np.nanvar() - 注意数据类型:如果数组是整型(如
int64),而你又用了ddof=1且样本数为 1,会触发除零,返回inf或nan - 浮点精度问题可能导致极小方差(如
1e-16),看起来像 0,实际不是
和 Python 内置 statistics 模块混用容易出错
statistics.mean() 和 statistics.variance() 只接受一维可迭代对象,不能直接喂 NumPy 数组;而且它们默认按「样本」处理,statistics.variance() 等价于 np.var(..., ddof=1),但不支持 axis 参数。
- 别对
np.ndarray直接调statistics.mean(arr),会报TypeError: must be real number - 如果硬要混用,先转成列表:
statistics.mean(arr.tolist()),但失去向量化优势,大数组很慢 - 同理,
statistics.pstdev()对应「总体标准差」,相当于np.sqrt(np.var(arr)),不是np.std(arr)(后者默认也是总体 std)
性能差异明显:小数组无所谓,大数组必须用 NumPy 原生函数
用纯 Python 循环或 sum()/len() 手算平均值,在百万级元素上比 np.mean() 慢 10–50 倍;方差更明显,因为涉及两趟遍历(先均值后平方差),而 np.var() 是单趟 C 实现。
立即学习“Python免费学习笔记(深入)”;
- 避免这种写法:
sum(arr) / len(arr)(arr是ndarray)——它强制 Python 层逐个取值 - 也不要用
np.array([x**2 for x in arr]).mean()这类推导式,创建中间数组浪费内存 - 真要极致性能且只算一次均值+方差,可用
np.mean(arr), np.var(arr)同时调用,NumPy 内部不会重复扫描
dtype 会影响结果,比如用 float32 算大数组方差可能因累积误差偏高,这时候显式传 dtype=np.float64 更稳妥。


















