如何使用np.cumsum实现滑动均值计算及两种实现的等价性验证
逻辑验证结论
两段代码的单窗口计算逻辑完全一致,仅输出长度和覆盖范围存在差异:
- 原循环版本仅计算中心对齐的滑动窗口,输出长度为
len(ar) - window,比cumsum版本少1个元素 - cumsum版本会计算所有完整的滑动窗口,输出长度为
len(ar) - window + 1,多出的1个元素是原循环未覆盖的末尾窗口计算结果
验证代码
你可以直接运行以下代码验证数值一致性:
import numpy as np window = 100 ar = np.random.rand(100000) half_win = int(window/2) # 原循环实现 PVI = [] for i in range(half_win, len(ar)-half_win): PVI.append(np.sqrt(np.mean(ar[i-half_win:i+half_win]**2))) PVI = np.array(PVI) # 你的cumsum实现 cumsum_vec = np.cumsum(np.insert(ar**2, 0, 0)) PVI_new = np.sqrt((cumsum_vec[window:] - cumsum_vec[:-window]) / window) # 对比重叠部分数值 print("重叠窗口数值完全相等:", np.allclose(PVI, PVI_new[:-1])) print("原循环输出长度:", len(PVI)) print("cumsum版本输出长度:", len(PVI_new))
运行后会得到重叠部分数值完全相等的结果。
对齐修正方案
如果需要cumsum版本和原循环输出完全等价,只需截取cumsum结果的前len(ar)-window个元素即可:
PVI_new = np.sqrt((cumsum_vec[window:] - cumsum_vec[:-window]) / window)[:-1]
该cumsum实现相比原循环性能提升超过100倍,完全满足提速需求。
内容的提问来源于stack exchange,提问作者jokerp
相关产品推荐
相关产品推荐

