Python 中 signal.filtfilt 中的 Padlen 错误
Error with Padlen in signal.filtfilt in Python
我正在 Python 中使用库 "scipy.signal",我有下一个代码:
from scipy import signal
b = [ 0.001016 0.00507999 0.01015998 0.01015998 0.00507999 0.001016 ]
a = [ 1. -3.0820186 4.04351697 -2.76126457 0.97291013 -0.14063199]
data = [[ 1.]
[ 1.]
[ 1.]
...]
# length = 264
y = signal.filtfilt(b, a, data)
但是当我执行代码时,我收到下一条错误消息:
The length of the input vector x must be at least padlen, which is 18.
我能做什么?
看来data
是一个二维数组,形状为(264, 1)。默认情况下, filtfilt
沿输入数组的最后一个轴进行过滤,因此在您的情况下,它试图沿数据长度为 1 的轴进行过滤,这对于默认填充方法来说不够长。
我假设您打算将 data
解释为一维数组。您可以添加参数 axis=0
y = signal.filtfilt(b, a, data, axis=0)
沿第一个维度(即向下列)进行过滤,在这种情况下,输出 y
也将具有形状 (264, 1)。或者,您可以将输入转换为一维数组,方法是使用 np.ravel(data)
将其展平或使用索引到 select 第一列(也是唯一的)列 data[:, 0]
。 (后者仅在 data
实际上是一个 numpy 数组而不是列表列表时才有效。)例如
y = signal.filtfilt(b, a, np.ravel(data))
在这种情况下,输出 y
也将是一个一维数组,形状为 (264,)。
假设您有一个形状为 (264, 2) 的二维数组,您还可以使用 np.hsplit()
将 data
拆分为两个单独的数组,如下所示:
import numpy as np
arr1, arr2 = np.hsplit(data,2)
您可以查看每个单独数组的形状,例如:
print(arr1.shape)
您的代码将如下所示:
y1 = signal.filtfilt(b, a, arr1)
y2 = signal.filtfilt(b, a, arr2)
我正在 Python 中使用库 "scipy.signal",我有下一个代码:
from scipy import signal
b = [ 0.001016 0.00507999 0.01015998 0.01015998 0.00507999 0.001016 ]
a = [ 1. -3.0820186 4.04351697 -2.76126457 0.97291013 -0.14063199]
data = [[ 1.]
[ 1.]
[ 1.]
...]
# length = 264
y = signal.filtfilt(b, a, data)
但是当我执行代码时,我收到下一条错误消息:
The length of the input vector x must be at least padlen, which is 18.
我能做什么?
看来data
是一个二维数组,形状为(264, 1)。默认情况下, filtfilt
沿输入数组的最后一个轴进行过滤,因此在您的情况下,它试图沿数据长度为 1 的轴进行过滤,这对于默认填充方法来说不够长。
我假设您打算将 data
解释为一维数组。您可以添加参数 axis=0
y = signal.filtfilt(b, a, data, axis=0)
沿第一个维度(即向下列)进行过滤,在这种情况下,输出 y
也将具有形状 (264, 1)。或者,您可以将输入转换为一维数组,方法是使用 np.ravel(data)
将其展平或使用索引到 select 第一列(也是唯一的)列 data[:, 0]
。 (后者仅在 data
实际上是一个 numpy 数组而不是列表列表时才有效。)例如
y = signal.filtfilt(b, a, np.ravel(data))
在这种情况下,输出 y
也将是一个一维数组,形状为 (264,)。
假设您有一个形状为 (264, 2) 的二维数组,您还可以使用 np.hsplit()
将 data
拆分为两个单独的数组,如下所示:
import numpy as np
arr1, arr2 = np.hsplit(data,2)
您可以查看每个单独数组的形状,例如:
print(arr1.shape)
您的代码将如下所示:
y1 = signal.filtfilt(b, a, arr1)
y2 = signal.filtfilt(b, a, arr2)