如何在Numpy中不使用for循环实现递推加权计算,提升大数据量运行速度
解决方案
你要实现的是一阶递归指数加权移动平均,有两种无循环实现方案,性能均远高于原生Python for循环,可直接匹配原计算结果:
方案1:使用scipy.signal.lfilter(性能最优)
该方法是底层C实现的递归滤波函数,内存占用低,处理百万级数据也无压力。
代码示例
import numpy as np from scipy.signal import lfilter dec = 0.1 data = np.array([100,200,300,400,500]) # 直接调用lfilter实现匹配原递推逻辑的计算 y = lfilter(b=[1 - dec], a=[1, -dec], x=data)
输出结果
array([ 90. , 189. , 288.9 , 388.89 , 488.889])
和原for循环输出完全一致。
方案2:纯NumPy向量化实现(无需额外依赖)
如果不想引入scipy依赖,也可以用NumPy内置的累积运算实现:
代码示例
import numpy as np dec = 0.1 data = np.array([100,200,300,400,500]) alpha = 1 - dec n = len(data) exp_weights = dec ** np.arange(n) y = np.cumsum(data * alpha / exp_weights) * exp_weights
输出结果和方案1完全相同。
原错误写法原因说明
你之前的改写方案仅对第一项做了衰减,后续所有项都固定加dec * data[0],没有用到前一步的迭代计算结果,因此从第三项开始就和预期结果不符。
内容的提问来源于stack exchange,提问作者Akilesh
相关产品推荐
相关产品推荐

