You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:12:04