矢量化的 `signal.lfilter`
我正在尝试对一组一维数组使用 lfilter
,也就是说,我有一个二维数组,它的每一行代表不同的信号。以下是我的代码:
import numpy as np
from scipy import signal
from scipy import stats
sysdim=2 #dimension of filter, i.e. the amount that it depends on the past
ksim=100 #number of different singals to be filtered
x_size=10000
# A and C are
A=np.random.randn(sysdim*ksim).reshape((ksim,sysdim))
B=np.random.randn(sysdim*ksim).reshape((ksim,sysdim))
C=2.0*np.random.randn(sysdim*ksim).reshape((ksim,sysdim))
D=2.0*np.random.randn(sysdim*ksim).reshape((ksim,sysdim))
print A.shape,np.random.randn(x_size*ksim).reshape((ksim,x_size)).shape
x=signal.lfilter(A,np.hstack((np.ones((ksim,1)),C)),np.random.randn(x_size*ksim).reshape((ksim,x_size)),axis=1)
y=signal.lfilter(B,np.hstack((np.ones((ksim,1)),D)),x,axis=1)
但是我遇到了以下错误:
ValueError: object too deep for desired array
有人能帮我一下吗?
1 个回答
1
你在 x=...
这一行遇到了错误。
你的参数形状是:分子是 (100,2),分母是 (100,3),数据是 (100,10000)。你遇到的问题是,lfilter 这个函数希望对所有处理的项目使用相同的过滤器,也就是说,它只接受一维的向量作为分子和分母。
看起来你真的需要把这个处理变成一个沿着行的循环。可以参考下面的代码:
# denom_array: R different denominators in an array with R rows
# numer_array: R different numerators in an array with R rows
# data: R data vectors in an array with R rows
# out_sig: output signal
out_sig = array([ scipy.signal.lfilter(denom_array[n], numer_array[n], data[n]) for n in range(data.shape[0])] )
想了解更多关于 lfilter 的信息,可以查看 这个链接。
(不过别担心,性能影响很小,大部分时间都花在过滤上。)