最稳选择是numpy.mean和numpy.std,需明确指定axis和ddof参数;含nan用nanmean/nanstd;pandas.describe适合概览但取值需谨慎;statistics模块仅适用于小规模纯Python场景。

用 numpy.mean 和 numpy.std 算均值方差最稳
直接调 numpy 是最省心的选择,它默认按展平数组算,但多数时候你要的是按轴统计——比如一维数组求整体均值,二维数组按列求均值。不指定 axis 参数容易误算成整个矩阵的单个值。
-
numpy.mean(x)默认返回标量;加axis=0才对每列求均值,axis=1对每行 -
numpy.std(x)默认是「总体标准差」(除以n),不是样本标准差(除以n-1);要样本标准差必须显式写ddof=1 - 如果输入含
nan,结果直接变nan;得换numpy.nanmean、numpy.nanstd - 示例:
np.std([1,2,3,4], ddof=1)→ ≈1.825,而np.std([1,2,3,4])→ 1.118
用 pandas.Series.describe 快速看全貌,但别依赖它取单个值
你只是想快速检查数据分布?describe() 一行打出 count/mean/std/min/25%/50%/75%/max,很香。但它返回的是 Series,不是纯数字;想取均值得写 .loc['mean'],容易手滑写成 .mean(那是方法名,不是值)。
-
pd.Series([1,2,3]).describe()['mean']→ 正确取值 -
pd.Series([1,2,3]).describe().mean→ 返回另一个Series,内容是各统计项的均值,完全不是你要的 - 空值会自动被跳过(等价于
skipna=True),这点比裸numpy友好 - 对
DataFrame调用时,默认按列统计;想按行得加axis=1,但这时describe()不支持,得改用apply
statistics.mean 和 statistics.stdev 只适合小数据、纯 Python 场景
标准库 statistics 模块不依赖第三方,适合写脚本或教学演示。但它只吃 list、tuple 这类序列,不能直接喂 numpy.ndarray 或 pd.Series,强转会丢精度(比如 float32 变 float64)。
-
statistics.mean([1,2,3])→ OK;statistics.mean(np.array([1,2,3]))→ 报TypeError -
statistics.stdev强制要求至少两个数,否则抛StatisticsError;numpy.std则返回0.0或nan(取决于ddof) - 没有
axis、没有nan处理、没有向量化——数据一多就慢,别在循环里反复调它
方差和标准差别混:var 是 std ** 2,但 ddof 必须一致
有人图省事,算完 std 再平方当方差,这没问题——前提是 ddof 设置相同。否则 np.var(x, ddof=1) 和 np.std(x, ddof=0)**2 完全对不上。
立即学习“Python免费学习笔记(深入)”;
- 统一用
ddof=1:样本方差用np.var(x, ddof=1),样本标准差用np.std(x, ddof=1) - 别用
np.var算完再开方,因为浮点误差可能略大于直接调np.std - 注意命名:Pandas 的
Series.var()默认ddof=1,而numpy.var()默认ddof=0——跨库混用前务必确认
实际用的时候,90% 的情况就该无脑用 np.mean 和 np.std,把 axis 和 ddof 写清楚。其余方案要么太重(pandas)、要么太脆(statistics)、要么暗藏不一致(var/std 分开设 ddof)。










