将Matlab fillgaps.m移植到Python时scipy.signal.lfilter报错问题
Fixing
ValueError: object of too small depth for desired array in scipy.signal.lfilter 我之前在移植MATLAB滤波代码到Python时也踩过这个坑,SciPy的lfilter和MATLAB的filter在初始条件的格式要求上有不少容易忽略的差异,这应该就是你遇到报错的核心原因。结合你的情况,给你几个针对性的解决方案:
统一数组维度为一维
MATLAB里的列向量/行向量导出到Python后经常会变成二维数组(比如形状为(n,1)或(1,n)),而scipy.signal.lfilter要求输入的滤波器系数、信号和初始条件都是一维数组。你可以用numpy的squeeze()或flatten()方法把所有数组转成一维:import numpy as np # 假设b, a, zi是从.mat导入的数组 b = b.squeeze() a = a.squeeze() zi = zi.squeeze()处理后再检查
b.ndim、a.ndim和zi.ndim,确保它们都等于1。验证初始条件
zi的长度匹配
MATLAB和SciPy对初始条件的长度要求是一致的(都需要等于max(len(b), len(a)) - 1),但有时候导出过程中可能出现维度错位导致长度异常。你可以手动校验:required_zi_len = max(len(b), len(a)) - 1 if len(zi) != required_zi_len: # 如果长度不符,截取或补零(不过你MATLAB能正常运行,大概率长度是对的,这里主要做校验) zi = zi[:required_zi_len]强制转换为浮点数据类型
虽然你说已经检查过数据类型,但MATLAB导出的数组可能带有整数类型或者其他非浮点类型,而lfilter对输入类型有严格要求。你可以强制把所有数组转为float64:b = np.asarray(b, dtype=np.float64) a = np.asarray(a, dtype=np.float64) zi = np.asarray(zi, dtype=np.float64)尝试用
lfilter_zi生成兼容的初始条件(备选)
如果上述方法都无效,你可以用SciPy自带的lfilter_zi函数生成匹配的初始条件,再替换成你从MATLAB导出的zi值(确保长度一致):from scipy.signal import lfilter, lfilter_zi # 生成默认初始条件模板 zi_template = lfilter_zi(b, a) # 替换为你的MATLAB导出值(假设长度匹配) zi = zi_template * zi[0] # 或者直接赋值,如果你的zi是正确的稳态值
按照以上步骤调整后,再调用lfilter(b, a, x, zi)应该就能解决这个深度不足的报错了。
内容的提问来源于stack exchange,提问作者MoogleLogic
相关产品推荐
相关产品推荐

