np.average计算加权平均需权重与数据同形,否则报错;加权方差须手算,用加权均值代入平方偏差;含NaN时应使用np.ma.average;权重无需手动归一化。

用 np.average 计算加权平均值时权重必须和数据同形
直接传入一维数组和对应权重即可,但常见错误是权重长度不匹配或维度不一致。比如数据是 (10,),权重却给成 (5,) 或 (10, 1),会报 ValueError: weights sum to zero or not the same shape as a。
实操建议:
- 用
a.shape == weights.shape显式检查形状,尤其在处理二维数组按行/列加权时 - 若想对二维数组每行单独加权,需指定
axis=1,且weights必须是二维(如(n_rows, n_cols))或能广播为该形状 - 权重可为浮点数,支持归一化(
weights / weights.sum()),但np.average内部自动处理,无需手动归一 - 示例:
np.average([1, 2, 3], weights=[0.1, 0.3, 0.6])→2.3
加权方差不能直接用 np.var,得手写或调 numpy.average 套用
np.var 不接受 weights 参数,强行传会静默忽略,结果仍是普通方差。正确做法是基于定义:加权方差 = 加权平均的平方偏差,即 np.average((x - weighted_mean)**2, weights=weights)。
注意点:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 必须用加权均值
weighted_mean = np.average(x, weights=weights),不能用np.mean(x),否则偏差失真 - 若需贝塞尔校正(样本加权方差),分母应为
1 - np.sum(weights**2) / np.sum(weights)**2,不是简单的n-1;NumPy 不内置该逻辑,需手动除 - 对 NaN 敏感:只要
x或weights含np.nan,结果就是nan,建议提前用np.nan_to_num或布尔索引过滤
用 np.ma.average 处理含缺失值的加权统计
当数据含 np.nan 或掩码数组(np.ma.masked_array)时,np.average 会传播 nan。此时应转为掩码数组并用 np.ma.average,它天然跳过被掩码的位置,且支持 weights。
操作要点:
- 构造掩码数组:
ma_data = np.ma.masked_invalid(data)(自动掩掉nan和inf) - 权重也需同步掩码,或确保其未被掩码位置对应有效数据;否则会警告并返回
masked - 示例:
np.ma.average(ma_data, weights=weights)返回标量,不是MaskedConstant - 注意:
np.ma.average的axis行为与np.average一致,但不支持returned=True
性能与精度:大数组下避免重复计算加权均值
加权方差需两次遍历(一次算均值、一次算偏差),对百兆级数组可能明显拖慢。若需多次计算不同权重下的方差,建议预存中间量;若只算一次,不必过度优化。
关键细节:
-
np.average底层用 C 实现,比纯 Python 循环快一个数量级,优先用它而非for手写 - 权重为整数时,数值稳定性略好于浮点权重,但差异通常可忽略
- 极端权重(如某值接近 1,其余接近 0)会导致
float64下的舍入误差放大,必要时可用dtype=np.longdouble,但兼容性受限
加权统计里最易被忽略的是:权重归一化不是必须步骤,np.average 自动按权重和做归一;但手算加权方差时,如果误把原始权重当概率分布用了,又没意识到分母隐含了权重和,结果就会系统性偏高。

















