应选用numpy.lib.stride_tricks.sliding_window_view,它通过调整strides和shape构造内存友好的视图,不复制数据,速度比python循环快10–100倍,输出形状为(n-w+1, w),需显式导入。

滑动窗口函数选 numpy.lib.stride_tricks.sliding_window_view 而不是手写循环
NumPy 1.20+ 内置的 sliding_window_view 是目前最直接、内存友好的选择。它不复制数据,而是通过调整数组的 strides 和 shape 构造视图,速度比 Python 循环快 10–100 倍,也比 np.array([arr[i:i+w] for i in range(len(arr)-w+1)]) 少大量内存开销。
常见错误是忽略其返回结果的维度变化:输入一维数组 arr(长度 N),窗口大小 w,输出是二维数组 shape (N-w+1, w),不是三维或自动降维。
- 必须显式导入:
from numpy.lib.stride_tricks import sliding_window_view - 若 NumPy 版本 numba.jit 加速的手写循环,或升级 NumPy
- 对 float32 数据,
sliding_window_view返回视图仍保持原 dtype,无需额外转换
提取统计特征时优先用 axis=1 向量化计算
拿到窗口视图后,别再用 for 遍历每个窗口算均值/标准差。直接在第二轴(即每个窗口内部)调用 NumPy 的聚合函数,利用底层 C 实现批量处理。
例如计算每个窗口的均值、标准差、最大值差(max-min):
import numpy as np from numpy.lib.stride_tricks import sliding_window_view <p>x = np.random.randn(1000) windows = sliding_window_view(x, window_shape=50) # shape (951, 50)</p><p>means = windows.mean(axis=1) # shape (951,) stds = windows.std(axis=1) # shape (951,) ranges = windows.max(axis=1) - windows.min(axis=1) # shape (951,)</p>
注意:std 默认是样本标准差(ddof=0),若需无偏估计,显式写 windows.std(axis=1, ddof=1);axis=1 不能省略,否则会压缩整个二维数组成单个标量。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
处理边界与非整除窗口时,明确用 pad 还是截断
sliding_window_view 默认只生成完整窗口,末尾不足 window_shape 的元素直接丢弃(即“valid”模式)。这在时序建模中常导致特征长度变短,影响后续对齐。
- 需要等长输出?先用
np.pad补零或边缘值:x_padded = np.pad(x, (0, 49), mode='edge'),再套窗口 - 补全后注意:补的是原始序列末端,不是每个窗口单独补;
mode='reflect'或'wrap'在某些周期信号中更合理 - 避免用
scipy.signal.convolve替代——它适合线性滤波,但不直接支持任意统计量(如分位数、偏度)
高阶特征(如偏度、分位数)慎用 axis=1 + scipy.stats
scipy.stats.skew、scipy.stats.mstats.mquantiles 等函数不支持 axis 参数,无法直接作用于二维窗口视图。强行 np.apply_along_axis 会退化为 Python 循环,丧失向量化优势。
可行方案:
- 偏度:用公式手动实现(基于三阶中心矩),复用
windows.mean(axis=1)和windows.var(axis=1, ddof=0) - 分位数:用
np.quantile(windows, q, axis=1)(NumPy ≥ 1.15),q可为标量或数组,返回对应维度结果 - 自定义函数且必须用 scipy?用
numba.jit(nopython=True)包一层,输入windows,内部用for但编译后接近 C 速度
真正容易被忽略的是:当窗口数超 10⁵ 且窗口宽超 100 时,即使视图不复制数据,windows 的 strides 结构也可能触发某些 NumPy 函数的隐式拷贝(如部分 np.sort 变体),建议用 np.may_share_memory(x, windows) 检查是否仍是视图。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










