在python中向量化递归关系for循环

时间:2019-02-13 19:03:02

标签: python numpy for-loop

我的周期性关系如下:

f_0 = s_0
f_1 = alpha * s_1 + (1 - alpha) * f_0
f_2 = alpha * s_2 + (1 - alpha) * f_1
...
f_n = alpha * s_n + (1 - alpha) * f_n-1

这很容易将其编码为for循环(示例代码)

import numpy as np
## values for example only ##
s = np.linspace(0, 10, 3000)
alpha = 1 / 5
f = s.copy()
for i in range(1, len(s)):
    f[i] = alpha * s[i] + (1 - alpha) * f[i-1]
我的斗争正在寻找一种矢量化这种关系的方法。我试过对切片索引很聪明,但是类似

f[1:] = alpha * s[1:] + (1 - alpha) * f[:-1]

显然不正确,因为它不会更新f

有没有一种明显的方法可以向量化此递归关系?如果可能的话,我宁愿避免这种for循环,因为作为优化例程的一部分,我的代码将不得不执行数千次此操作。

谢谢!

更新

感谢您的反馈。我尝试了一个简单的numba实现@jit,它实际上使循环快了50倍吗?作为numba的新手,是否有任何方法可以进一步调整这些结果?

1 个答案:

答案 0 :(得分:0)

您可以将其更改为矩阵方程式。如果将f和s编写为numpy数组(1d)并编写2d numpy矩阵M,则:

F = numpy.dot(M,S) 

然后,您只需创建一次矩阵(它仅取决于alpha),并且可以在其他S上继续使用它。 第一次检查时,矩阵看起来像:

|1,0,0,0|
|(1-alpha),alpha,0,0|
|(1-alpha)^2,(1-alpha),alpha,0|
|(1-alpha)^3,(1-alpha)^2,(1-alpha),alpha|