cupyx.scipy.signal.savgol_filter#

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

对数组应用 Savitzky-Golay 滤波器。

这是一个一维滤波器。如果 x 的维度大于 1,axis 参数确定应用滤波器的轴。

参数:
  • x (array_like) – 要滤波的数据。如果 x 不是单精度或双精度浮点数组,它将在滤波前被转换为 numpy.float64 类型。

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

  • polyorder (int) – 用于拟合样本的多项式阶数。polyorder 必须小于 window_length

  • deriv (int, 可选) – 要计算的导数阶数。这必须是非负整数。默认值为 0,表示对数据进行滤波而不进行微分。

  • delta (float, 可选) – 应用滤波器的样本间距。仅当 deriv > 0 时使用。默认值为 1.0。

  • axis (int, 可选) – 对数组 x 应用滤波器的轴。默认值为 -1。

  • mode (str, 可选) – 必须是 ‘mirror’、‘constant’、‘nearest’、‘wrap’ 或 ‘interp’。这决定了用于应用滤波器的填充信号的扩展类型。当 mode 为 ‘constant’ 时,填充值由 cval 提供。有关 ‘mirror’、‘constant’、‘wrap’ 和 ‘nearest’ 的更多详细信息,请参阅“注意”部分。选择 ‘interp’ 模式(默认值)时,不使用扩展。相反,将对边缘的最后 window_length 个值拟合一个 polyorder 阶的多项式,并使用此多项式评估最后 window_length // 2 个输出值。

  • cval (scalar, 可选) – 如果 mode 是 ‘constant’,用于填充输入边缘以外的值。默认值为 0.0。

返回值:

y – 滤波后的数据。

返回类型:

ndarray,形状与 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])