numpy sliding_window_view输出维度疑问:为何得到(3,1,3,3)而非期望的(3,3,3)?
问题解析与解决方案
1. 为什么输出形状是(3,1,3,3)?
当你调用np.lib.stride_tricks.sliding_window_view(arr, (3,3))时,NumPy会默认在输入数组的所有轴上应用滑动窗口逻辑。你的输入数组arr形状是(5,3),对应两个轴:
- 轴0(时间维度)长度为5,窗口大小设为3,滑动后可得到
5-3+1=3个窗口位置; - 轴1(特征维度)长度为3,窗口大小也设为3,滑动后只能得到
3-3+1=1个窗口位置(因为刚好填满整个特征维度,没有滑动空间)。
滑动窗口的输出结构遵循「各轴滑动后的位置数 + 窗口自身形状」的规则,也就是(轴0滑动位置数, 轴1滑动位置数, 窗口轴0大小, 窗口轴1大小),最终就得到了(3,1,3,3)的形状。其中第二个长度为1的维度,就是特征维度上无滑动空间导致的冗余维度。
2. 无需reshape得到(3,3,3)形状的方法
你真正需要的是仅在时间维度(轴0)上滑动窗口,同时保留特征维度的完整结构。可以通过指定axis参数明确告诉函数只在目标轴上应用窗口:
import numpy as np arr = np.arange(15).reshape(5,3) result = np.lib.stride_tricks.sliding_window_view(arr, window_shape=3, axis=0) print(result.shape) # 输出 (3, 3, 3)
这样设置后,函数仅在轴0上滑动大小为3的窗口,每个窗口包含3个时间步的完整特征(每个时间步3个特征),输出自然就是你想要的3阶数组。
另一种等价写法是用None标记不需要滑动的轴,明确指定窗口形状对应目标轴:
result = np.lib.stride_tricks.sliding_window_view(arr, window_shape=(3, None))
这里None表示该轴保持原维度长度不应用滑动,输出形状同样为(3,3,3)。
内容的提问来源于stack exchange,提问作者meliniak
相关产品推荐
相关产品推荐

