如何在python中向量化这个循环?

时间:2014-06-05 08:06:36

标签: python performance numpy vectorization

如何对这段伪代码进行矢量化:

for i from 1 to n
   y[i] := y[i-1] + α * (x[i] - y[i-1])

2 个答案:

答案 0 :(得分:4)

你原来的等式可以写成:

y[i] = alpha*x[i] + (1-alpha)*y[i-1]

这是一个无限脉冲响应(IIR)滤波器。你可以采用Z变换得到:

Y(z) = alpha*X(z) + (1-alpha)*Y(z^-1)

可以操作以提供过滤器的传递函数

Y(z)/X(z) = alpha/(1 + (alpha-1)*z^-1)

您可以使用lfilter (docs)中的scipy.signal功能加快计算速度:

import scipy.signal as sig
y = sig.lfilter([alpha], [1, alpha-1], x)

严格来说,这不是矢量化。但它具有相同的效果:它通过在C中执行循环来加速计算。

答案 1 :(得分:1)

无法进行矢量化。你的归纳只是y [i] = a * x [i] +(1-a)* y [i-1]


将y [n]视为多项式,a * x [i]和y [0]将是系数,1-a将是变量。并且无法对多项式的求值进行矢量化。