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 滤波器应用到一个阵列。

这是一个一维滤波器。如果 x 的维度大于 1,axis 决定了沿其应用滤波器的轴。

参数:
xarray_like

待滤波的数据。 如果 x 不是单精度或双精度浮点阵列,则在滤波之前,它将转换为 numpy.float64 类型。

window_lengthint

滤波器窗口的长度(即系数数)。如果 mode 为 ‘interp’,window_length 必须小于或等于 x 的大小。

polyorderint

用于拟合样本的多项式阶数。em class="xref py py-obj">polyorder 必须小于 em class="xref py py-obj">window_length

derivint,可选项

要计算的导数阶数。它必须是正整数。默认值为 0,表示在不求导的情况下过滤数据。

deltafloat,可选项

要使用滤波器的样本间距。仅在 deriv > 0 时使用它。默认值为 1.0。

axisint,可选项

要应用滤波器的数组 em class="xref py py-obj">x 轴。默认值为 -1。

modestr,可选项

必须为“镜像”、“常数”、“最近”、“环绕”或“插值”。它确定要应用滤波器的填充信号要使用的扩展类型。当 em class="xref py py-obj">mode 为“常量”时,填充值由 em class="xref py py-obj">cval 提供。有关“镜像”、“常量”、“环绕”和“最近”的更多详细信息,请参阅注释。选择“插值”模式(默认)时,不会使用任何扩展。相反,适合最后 em class="xref py py-obj">window_length 边缘值的 em class="xref py py-obj">polyorder 多项式,然后使用此多项式来评估最后 em class="xref py py-obj">window_length // 2 输出值。

cval标量,可选项

如果 em class="xref py py-obj">mode 为“常量”,则在输入边缘后填充的值。默认值为 0.0。

返回:
yndarray,与 em class="xref py py-obj">x 形状相同

已过滤的数据。

请参见

savgol_coeffs

注释

有关 em class="xref py py-obj">mode 选项的详细信息

“镜像”

按反向顺序重复边缘的值。不包括最靠近边缘的值。

“最近”

扩展包含最近输入值。

“常量”

扩展包含 em class="xref py py-obj">cval 参数给定的值。

“环绕”

扩展包含数组另一端的值。

例如,如果输入为 [1, 2, 3, 4, 5, 6, 7, 8],并且 em class="xref py py-obj">window_length 为 7,则以下内容显示了各种 em class="xref py py-obj">mode 选项的扩展数据(假设 em class="xref py py-obj">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 一起使用时,最后三个值保持不变。将其与 em class="xref py py-obj">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])