向量化计算不同分割点下从0位起始的子向量方差,替代for循环
无循环实现前缀子数组方差计算
实现原理
根据总体方差的数学定义,可展开为如下形式:
方差 = 元素平方的均值 - 均值的平方
我们可以利用numpy的向量化累加函数np.cumsum一次性计算所有前缀的元素和、元素平方和,再通过向量运算直接得到所有前缀的方差,全程无显式for循环,运算效率远高于循环实现,尤其适合长数组场景。
实现代码
import numpy as np # 原示例测试数据 np.random.seed(1) arr = np.random.normal(size=100) # 无逻辑计算核心代码 n_arr = np.arange(1, arr.size + 1) cumsum = np.cumsum(arr) cumsum_sq = np.cumsum(arr ** 2) res = cumsum_sq / n_arr - (cumsum / n_arr) ** 2
结果一致性验证
你可以和原for循环的输出对比,二者在浮点误差范围内完全相等:
# 原for循环实现 res_loop = [] for i in range(1, arr.size+1): subvector = arr[:i] var = np.var(subvector) res_loop.append(var) # 验证相等 print(np.allclose(res, res_loop)) # 输出 True
扩展说明
如果你需要计算样本方差(即方差计算时分母为n-1而非n),只需要调整运算逻辑即可:
# 样本方差版本实现 res_sample = (cumsum_sq - cumsum**2 / n_arr) / (n_arr - 1)
内容的提问来源于stack exchange,提问作者Brenlla
相关产品推荐
相关产品推荐

