簡體   English   中英

向量化的signal.lfilter

[英]Vectorised `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 

有人可以指導我嗎?

因此,您在x=...行上得到了錯誤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])] ) 

有關提升器期望的更多信息,請參見http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html

(但請放心,性能影響很小,無論如何,大多數時間都花在了過濾上。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM