如何基于数值计数(直方图+分箱)高效计算方差或标准差
直方图分箱数据的高效方差计算方案
核心实现思路
直接基于直方图计数和分箱值做加权统计即可,完全不需要重建原始数组,时间复杂度仅和分箱数量成正比,和原始数据总规模无关,是当前场景下的最优方案。
该方案基于方差的数学拆解公式实现:
总体方差 = 数据平方的加权平均值 - (数据加权平均值)²
其中权重为每个分箱对应的计数,分箱取值直接使用给定的bins数组元素即可。
代码实现
import numpy as np # 给定的直方图和分箱数据 hist = np.array([1,1,2,1,2]) bins = np.array([0,1,2,3,4]) # 计算总样本量 n = hist.sum() # 计算加权均值 mean = (hist * bins).sum() / n # 计算平方的加权均值 mean_sq = (hist * bins ** 2).sum() / n # 计算总体方差,和np.var默认参数ddof=0结果完全一致 var = mean_sq - mean ** 2 # 如果需要计算样本方差(对应np.var的ddof=1参数),调整分母即可 # var_sample = (hist * (bins - mean) **2).sum() / (n -1)
上述代码计算得到的结果和重建数组后调用np.var的结果完全一致,但性能优势显著:
- 当单分箱计数极大、原始数据总规模远大于分箱数时,该方法内存占用和计算耗时都会比重建数组的方案低几个数量级,不会产生大量重复元素的内存开销
- 无需额外构造原始数组的操作,没有冗余的计算步骤
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

