数组平滑滤波用numpy实现:中位数滤波抗突发噪声,混合滤波(中位数+滑动平均)适配毛刺与波动,加权滑动平均兼顾阶跃响应;需注意边界处理、核归一化、标准差验证及趋势分离。

用数组做信号平滑滤波,核心是把原始数据转成一维数值数组,再通过卷积、滑动窗口或排序替换等数学操作批量压制噪声——不靠模型,不调大库,几行 NumPy 就能落地。
选对方法:按噪声类型匹配数组操作
突发噪声(比如传感器跳变、通信误码)本质是孤立的异常值,不是连续波动。平均类方法容易被它拖偏,中位数类更鲁棒:
- 脉冲型突发噪声(单点尖峰/深谷):优先用中位数滤波。窗口取奇数(如3、5),每步取子数组排序后中间值,天然跳过极值;
- 密集毛刺+背景波动(如EMI干扰叠加高斯噪声):先中位数滤波“去野值”,再滑动平均“压波动”,两步数组流水线;
- 趋势缓慢但含周期性突变(如设备启停引起的阶跃):用带边界的加权滑动平均,新数据权重高(如[0.2, 0.3, 0.5]),减少滞后又保响应。
NumPy 实战:三行代码完成主流平滑
所有操作都基于原始信号数组 x = np.array([...]),无需循环:
-
滑动平均(均值滤波):
y = np.convolve(x, np.ones(5)/5, 'same')—— 窗口5,自动补零,长度不变; -
中位数滤波:
from scipy.signal import medfilt→y = medfilt(x, kernel_size=5)(注意 kernel 必须为奇数); -
混合滤波(推荐突发场景):
y = np.convolve(medfilt(x, 3), np.ones(5)/5, 'same')—— 先3点中位去尖峰,再5点均值稳基线。
关键细节:避免常见翻车点
数组平滑不是套公式,边界、归一化、验证缺一不可:
-
边界处理要显式声明:用
'same'模式时,np.convolve默认在两端补零,可能造成首尾失真。若原始信号首尾重要,改用mode='valid'截掉不可靠段,或手动用np.pad补边界值; -
核必须归一化:均值核写成
np.ones(5)/5,不能只写np.ones(5),否则输出幅值被放大5倍; -
验证不能只看图:计算平滑前后标准差变化,
std_before / std_after大于1.5才说明有效降噪;若下降不足,加大窗口或换中位数; - 突发噪声残留?检查是否混入趋势:若信号本身有缓慢上升,直接平滑会掩盖真实变化。先用差分或移动中位数估计趋势,再从原信号中减去,平滑残差,最后加回趋势。
变量特征提取:平滑后立刻可挖的有用信息
平滑不是终点,而是为了更准地读出变量行为:
-
突变点定位:对平滑后信号求一阶差分,找绝对值超过阈值的位置 ——
np.where(np.abs(np.diff(y)) > 0.3)[0]; -
活跃度量化:计算差分绝对值的均值
np.mean(np.abs(np.diff(y))),数值越大说明变量越“频繁动作”; - 稳定性评分:统计平滑后信号中相邻三点单调性变化次数(即拐点数),次数越少路径越稳。










