【发布时间】:2021-11-01 00:21:13
【问题描述】:
dec = 0.1
data = np.array([100,200,300,400,500])
我有一个这样的 for 循环
y = np.zeros(len(data))
for i in range(len(data)):
if i == 0:
y[i] = (1.0 - dec) * data[i]
else:
y[i] = (1.0 - dec) * data[i] + (dec * y[i - 1])
输出 y 是:
array([ 90. , 189. , 288.9 , 388.89 , 488.889])
现在我想在没有循环的情况下进行上述计算,所以如果我破坏代码并这样做
data[0] = (1.0 - dec) * data[0]
data[1:] = (1.0 - dec) * data[1:] + (dec * data[0])
输出数据为:
array([ 90, 189, 279, 369, 459])
当您比较 y 和 data 输出时,前两个值是正确的,因为它与 data[0] 相乘,这是有道理的,但稍后它应该像循环代码中的循环一样继续,那么我们如何实现呢?有没有可以处理这个的函数?这主要是为了优化我的代码,使其对数千个数据运行得更快。
预期输出与 y 输出相同。
【问题讨论】:
-
Duplicate of python - Is it possible to vectorize recursive calculation of a NumPy array where each element depends on the previous one? - Stack Overflow -- 除非这个问题有一些特殊的方法允许使用明确的形式
-
在这种特殊情况下,如果提供
dec ≤ 0.1并限制为 15 次迭代,您可以在纯 numpy 中以合理的准确度执行此操作;但是我怀疑它会比 numba 解决方案更快。 -
y[i] = (1 - dec) * sum(dec ** j * data[i - j] for j in range(i + 1))有一个特殊情况。这感觉就像你可以用巧妙的矩阵乘法来做的事情。 -
有人可以根据我的问题重新创建吗? @Adam.Er8