scipy.signal.

savgol_filter#

scipy.signal.savgol_filter(x, window_length, polyorder, deriv=0, delta=1.0, axis=-1, mode='interp', cval=0.0)[原始碼]#

將 Savitzky-Golay 濾波器應用於陣列。

這是 1-D 濾波器。如果 x 的維度大於 1,則 axis 決定了應用濾波器的軸。

參數:
xarray_like

要過濾的資料。如果 x 不是單精度或雙精度浮點陣列,它將在過濾前轉換為 numpy.float64 型別。

window_lengthint

濾波器視窗的長度(即係數的數量)。如果 mode 為 ‘interp’,window_length 必須小於或等於 x 的大小。

polyorderint

用於擬合樣本的多項式階數。polyorder 必須小於 window_length

derivint, optional

要計算的導數階數。這必須是非負整數。預設值為 0,表示在不過濾的情況下對資料進行濾波。

deltafloat, optional

將應用濾波器的樣本間距。僅當 deriv > 0 時使用。預設值為 1.0。

axisint, optional

陣列 x 中要應用濾波器的軸。預設值為 -1。

modestr, optional

必須為 ‘mirror’、‘constant’、‘nearest’、‘wrap’ 或 ‘interp’。這決定了用於擴展填充訊號的型別,濾波器將應用於該訊號。當 mode 為 ‘constant’ 時,填充值由 cval 給定。有關 ‘mirror’、‘constant’、‘wrap’ 和 ‘nearest’ 的更多詳細資訊,請參閱註解。當選擇 ‘interp’ 模式(預設值)時,不使用擴展。而是將 polyorder 次多項式擬合到邊緣的最後 window_length 個值,並且此多項式用於評估最後 window_length // 2 個輸出值。

cvalscalar, optional

如果 mode 為 ‘constant’,則填充輸入邊緣外的值。預設值為 0.0。

回傳:
yndarray,形狀與 x 相同

已過濾的資料。

另請參閱

savgol_coeffs

註解

mode 選項的詳細資訊

‘mirror’

以相反的順序重複邊緣的值。不包括最接近邊緣的值。

‘nearest’

擴展包含最接近的輸入值。

‘constant’

擴展包含由 cval 參數給定的值。

‘wrap’

擴展包含來自陣列另一端的值。

例如,如果輸入為 [1, 2, 3, 4, 5, 6, 7, 8],且 window_length 為 7,則以下顯示了各種 mode 選項的擴展資料(假設 cval 為 0)

mode       |   Ext   |         Input          |   Ext
-----------+---------+------------------------+---------
'mirror'   | 4  3  2 | 1  2  3  4  5  6  7  8 | 7  6  5
'nearest'  | 1  1  1 | 1  2  3  4  5  6  7  8 | 8  8  8
'constant' | 0  0  0 | 1  2  3  4  5  6  7  8 | 0  0  0
'wrap'     | 6  7  8 | 1  2  3  4  5  6  7  8 | 1  2  3

在版本 0.14.0 中新增。

範例

>>> import numpy as np
>>> from scipy.signal import savgol_filter
>>> np.set_printoptions(precision=2)  # For compact display.
>>> x = np.array([2, 2, 5, 2, 1, 0, 1, 4, 9])

使用視窗長度為 5 和 2 次多項式進行濾波。所有其他參數使用預設值。

>>> savgol_filter(x, 5, 2)
array([1.66, 3.17, 3.54, 2.86, 0.66, 0.17, 1.  , 4.  , 9.  ])

請注意,x 中的最後五個值是拋物線的樣本,因此當 mode='interp'(預設值)與 polyorder=2 一起使用時,最後三個值保持不變。將其與例如 mode='nearest' 進行比較

>>> savgol_filter(x, 5, 2, mode='nearest')
array([1.74, 3.03, 3.54, 2.86, 0.66, 0.17, 1.  , 4.6 , 7.97])