2015-02-23 71 views
1

的任何軸線根據SciPy的文檔爲lfilter施加初始條件:SciPy的lfilter沿着N-二d陣列

滋:array_like,用於過濾器的延遲可選 初始條件。它是長度爲max(len(a),len(b))-1的矢量(或用於N維輸入的矢量陣列)。如果zi是無或沒有給出,則假定初始休息。有關更多信息,請參閱lfiltic。

以下代碼調用lfilter,並使用lfilter_zi傳遞zi,以使zi的最後一個維度的長度爲max(len(a),len(b))-1。然而,它提出了一個錯誤,這取決於應用程序的軸:

import numpy as np 
import scipy.signal as sig 

def apply_filter(B, A, signal, axis=-1): 
    # apply filter, setting proper initial state (doesn't assume rest) 
    filtered, zf = sig.lfilter(B, A, signal, 
      zi=sig.lfilter_zi(B, A) * np.take(signal, 0, axis=axis)[..., np.newaxis], axis=axis) 
    return filtered 

B, A = sig.butter(1, 0.5) 
x = np.random.randn(12, 50) 
apply_filter(B, A, x, axis=1) # works without error 
apply_filter(B, A, x, axis=0) # raises ValueError 

ValueError: The number of initial conditions must be max([len(a),len(b)]) - 1

如何避免錯誤,並應用沿任意軸的過濾器,而不假定初始休息嗎?

回答

1

zi中的初始條件必須與給予lfilter的軸處於同一軸。改變這一:

np.take(signal, 0, axis=axis)[..., np.newaxis] 

np.take(signal, [0], axis=axis) 

np.take(signal, 0, axis=axis)np.take(signal, [0], axis=axis)之間的區別是,後者保留的維數。例如。

In [105]: signal 
Out[105]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14]]) 

In [106]: signal.shape 
Out[106]: (3, 5) 

如果我們take從軸1中的第一索引,我們得到具有形狀1-d陣列(3):

In [107]: a = np.take(signal, 0, axis=1) 

In [108]: a.shape 
Out[108]: (3,) 

In [109]: a 
Out[109]: array([ 0, 5, 10]) 

相反,如果我們使用在indices列表[0]參數,我們得到一個形狀數組(3,1):

In [110]: b = np.take(signal, [0], axis=1) 

In [111]: b.shape 
Out[111]: (3, 1) 

In [112]: b 
Out[112]: 
array([[ 0], 
     [ 5], 
     [10]]) 
+0

謝謝!爲什麼將索引從標量轉換爲列表可以訣竅? – user2561747 2015-02-24 18:11:26