我需要一个泄漏积分器--IIR滤波器--来实现:
y[i] = x[i] + y[i-1] * leakiness
下面的代码是有效的,但是,我的x向量很长,而且这是在一个内部循环中,所以我的问题是:
- 为了提高效率,有没有办法在numpy中将其矢量化?
- 如果不是numpy,使用scipy.信号滤波器算法之一是否有利?
迭代代码如下所示。state
只是前一个y[i-1]的值,它在连续调用中被结转:
import numpy as np
def leaky_integrator(x, state, leakiness):
y = np.zeros(len(x), dtype=np.float32)
for i in range(len(x)):
if i == 0:
y[i] = x[i] + state * leakiness
else:
y[i] = x[i] + y[i-1] * leakiness
return y, y[-1]
>>> leakiness = 0.5
>>> a1 = [1, 0, 0, 0]
>>> state = 0
>>> print("a1=", a1, "state=", state)
a1= [1, 0, 0, 0] state= 0
>>> a2, state = leaky_integrator(a1, state, leakiness)
>>> print("a2=", a2, "state=", state)
a2= [1. 0.5 0.25 0.125] state= 0.125
>>> a3, state = leaky_integrator(a2, state, leakiness)
>>> print("a3=", a3, "state=", state)
a3= [1.0625 1.03125 0.765625 0.5078125] state= 0.5078125
1条答案
按热度按时间aiazj4mn1#
我可以看到两个选择:
事实上如果
x=[a, b, c]
,s=state
,l=leakiness
那么然而,您可能需要生成一个大小为
x.size**2
的矩阵,并且即使对于较小的大小也可能会出现内存不足错误(例如,对于1M大小的数组,它会导致大约7 TiB,我认为这是不可行的)。回到numba实现,向已经实现的函数添加一个
@jit(nopython=True)
装饰器就足够了。在我的机器上用一个大小为1M的随机数组执行此操作:
(此处为numba性能备注)