使用scipy.signal.medfilt中值滤波遇零值及警告问题求助
问题解决:scipy.medfilt结果全0及自定义中值滤波NaN问题
一、scipy.signal.medfilt结果全0的解决方法
你的核心问题是输入的Torque是二维数组(形状为(570, 1)),而medfilt传入标量kernel_size=5时,会将该窗口尺寸应用到数组的所有维度。由于数组第二个维度长度仅为1,窗口大小5远超该维度范围,触发零填充警告,最终导致滤波结果全为0。
修复步骤:
- 将二维数组展平为一维,可使用
squeeze()或flatten()方法消除多余维度:
import numpy as np from scipy import signal # 提取数据并展平为一维数组 Torque = Torque_Middle_To_end[0:index].squeeze() # 应用中值滤波,此时kernel_size=5仅作用于一维,不会触发警告 filtered_data = signal.medfilt(Torque, 5)
这样处理后,数组形状变为(570,),窗口大小5远小于数组长度,警告会自动消失,滤波结果也会正常输出。
二、自定义numpy中值滤波窗口>3时出现NaN的解决方法
自定义滤波出现NaN的原因是边界窗口超出数组范围,numpy滑动窗口操作在处理边界时会引入无效值。通过先对数组进行边界填充即可解决:
示例实现(支持任意奇数窗口大小):
def custom_median_filter(data, kernel_size): # 计算需要填充的边界宽度 pad_width = kernel_size // 2 # 用边缘值填充边界,避免引入NaN padded_data = np.pad(data, pad_width, mode='edge') # 创建滑动窗口视图 sliding_windows = np.lib.stride_tricks.sliding_window_view(padded_data, kernel_size) # 对每个窗口计算中值 return np.median(sliding_windows, axis=1) # 使用示例 Torque = Torque_Middle_To_end[0:index].squeeze() filtered_data = custom_median_filter(Torque, 5)
这里采用mode='edge'填充(复制边缘值),你也可以根据需求选择'symmetric'(对称填充)或'constant'(常数填充)等模式。
内容的提问来源于stack exchange,提问作者Harith 75
相关产品推荐
相关产品推荐

