Python中statistics.stdev()处理NumPy数组为何出现异常计算结果
原因说明
statistics是Python标准库中为原生数值类型(int、float)设计的统计计算模块,本身不支持NumPy数组和NumPy专属数值类型,你遇到的异常结果是底层类型运算规则不匹配导致的。
具体底层逻辑:
- 遍历NumPy数组得到的单个元素是
numpy.int_/numpy.float_这类NumPy自定义标量,和Python原生数值的运算规则存在差异,比如整数运算的自动截断、类型推导逻辑不同,都会导致均值、方差的中间计算结果出错,最终得到不符合预期的标准差。 statistics模块的所有运算逻辑都没有针对NumPy数组结构做适配,即便部分场景下没有报错,也无法保证输出结果的正确性。
解决方案
如果处理的是NumPy数组,直接使用NumPy自带的标准差计算方法即可:
- 计算总体标准差:
np.std(arr),和你测试的结果一致,等价于statistics.pstdev的计算逻辑 - 计算样本标准差:添加
ddof=1参数,即np.std(arr, ddof=1),等价于statistics.stdev的计算逻辑 - 如果必须使用
statistics模块处理NumPy数组,先将数组转换为Python原生列表再传入:
stdev(a.tolist()) # 输出1.2909944487358056,符合预期
内容的提问来源于stack exchange,提问作者Jieyan Zhu
相关产品推荐
相关产品推荐

