【问题标题】:Python - ValueError: The length of the input vector x must be greater than padlen, which is 6Python - ValueError:输入向量x的长度必须大于padlen,即6
【发布时间】:2019-10-14 10:06:59
【问题描述】:

我在Python中使用函数filtfilt如下

import numpy as np
from scipy.signal import filtfilt

a = np.array([1, -lambd]).T
b = np.array([-lambd,1]).T
delayed = filtfilt(b,a,sig)

其中 sig 的形状为 (6,)。结果,我收到以下错误:

ValueError:输入向量x的长度必须大于padlen,即6。

由 scipy.signal 生成。

如果 sig 的形状为 (7,) 或更长,则相同的代码可以正常工作,而对于小于 (6,) 的任何形状,它都会返回相同的错误。有什么想法吗?

【问题讨论】:

  • padlen - int or None, optional - The number of elements by which to extend x at both ends of axis before applying the filter. This value must be less than x.shape[axis] - 1. padlen=0 implies no padding. The default value is 3 * max(len(a), len(b)).(x 是第三个元素,即你的签名)。在您的情况下,padlen 的默认值为 3*2=6 - 但同时`此值必须小于 x.shape[axis] - 1`。来源 - docs.scipy.org/doc/scipy/reference/generated/…
  • 尝试使用 filtfilt(b,a,sig, axis=0)
  • 试过axis=0,同样的错误信息
  • h4z3 - 看起来,根据 scipy.signal.filtfilt,这个错误与 filtfilt 函数本身有关,没有办法绕过它(除非我想使用更长的信号)。
  • 我现在正在实现 scipy.signal.lfilter,它不会出错。

标签: python filter scipy


【解决方案1】:

如果错误是说:

ValueError: 输入向量 x 的长度必须大于 padlen,即 6 [或其他]。

为什么不过滤信号子元素的长度> 6?

df = df[[len(x) > 6 for x in df['listSignal']]]

对我来说,过滤len(x) > 1 来避免错误已经足够了。 我在嵌套的“测试”列中有很多 0 长度和 1 长度的信号列表。我假设> 1 是必需的,因为只有长度为 2 提供左侧一项和右侧一项。

我从 https://github.com/leilamr/LowPassFilter 借来的函数保持不变:

import pandas as pd
from scipy.signal import butter, freqz, filtfilt

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False, fs=None)
    return b, a

def butter_lowpass_filter(x, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    return filtfilt(b, a, x)

过滤的 df len(x) > 1 没有错误(你自己试试,你的可能更高):

df = df[[len(x) > 1 for x in df['test']]]
df['testFilt'] = [butter_lowpass_filter(x, cutoff, fs, order) for x in df['test']]

感谢@DavideNardone 提出过滤函数返回值的想法,而我现在提前过滤主df,想法是一样的。

【讨论】:

    【解决方案2】:

    解释为什么会这样:

    对信号应用过滤器实际上是convolving带有过滤器的信号。
    只有当信号和滤波器都可以完全重叠时才定义卷积操作。
    由于您的滤波器大小为 6,因此信号必须至少为 6 大小才能定义卷积。

    处理它

    解决此问题的一种简单方法是忽略短信号。
    另一个是pad the signal with zeroshere


    @questionto42's answer 展示了另一种解决问题的好方法。

    【讨论】:

      【解决方案3】:

      使用小于sig 数组长度的padlen

      如下代码:

      import numpy as np
      from scipy.signal import filtfilt
      
      a = np.array([1, -lambd]).T
      b = np.array([-lambd,1]).T
      delayed = filtfilt(b,a,sig, padlen=len(sig)-1)
      

      【讨论】:

        猜你喜欢
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多