
本文介绍如何高效地对形状为 (n, 3) 的二维数组沿行方向(即按每行聚合为标量后)应用长度为 3 的滑动窗口均值,输出长度为 n−2 的一维结果数组,全程避免显式 python 循环。
本文介绍如何高效地对形状为 (n, 3) 的二维数组沿行方向(即按每行聚合为标量后)应用长度为 3 的滑动窗口均值,输出长度为 n−2 的一维结果数组,全程避免显式 python 循环。
在处理时间序列、传感器数据或多通道信号时,常需对二维数组(如 shape=(6000, 3))先按行压缩(例如取每行均值),再在其一维结果上执行滑动窗口统计(如滚动均值)。关键在于:不使用 for 循环,而是借助 NumPy 的向量化卷积操作实现高性能计算。
核心思路
-
行压缩:对原始二维数组
x沿 axis=1(列方向)求均值,得到一维数组row_means = np.mean(x, axis=1),形状为(6000,); -
滑动均值:将长度为 3 的均匀权重窗口
[1/3, 1/3, 1/3]与row_means做一维卷积,指定mode='valid'—— 该模式仅返回完全重叠的卷积结果,输出长度为len(row_means) - 3 + 1 = 5998,恰好符合预期。
完整示例代码
import numpy as np
# 示例数据:6000 行 × 3 列
x = np.random.randn(6000, 3)
# 执行滚动均值(窗口大小=3)
row_means = np.mean(x, axis=1) # shape: (6000,)
kernel = np.ones(3) / 3 # 归一化均值核
out = np.convolve(row_means, kernel, mode='valid') # shape: (5998,)
print(f"输入形状: {x.shape}")
print(f"输出形状: {out.shape}") # → (5998,)
注意事项
- ✅ 此方法完全向量化,性能远超 Python 循环,尤其适用于大数据规模;
- ⚠️
mode='valid'确保无边界填充,结果长度严格为N − window_size + 1(此处 6000 − 3 + 1 = 5998); - ⚠️ 若需其他窗口大小(如 5),只需将
np.ones(3)替换为np.ones(5)并相应调整除数; - ❌ 不适用于跨列方向的二维滑动(如对每个 3×3 子矩阵求均值),该场景需
skimage.util.view_as_windows或scipy.ndimage.uniform_filter。
综上,通过“降维 + 卷积”两步组合,即可简洁、高效、可扩展地完成此类滚动统计任务。










