我有一个numpy形状(6,2) [[00,01], [10,11], [20,21], [30,31], [40,41], [50,51]] 我需要一个步长为1的滑动窗口,窗口大小为3喜欢这个: [[00,01,10,11,20,21], [10,11,20,21,30,31], [20,21,30,31,40,41], [30,31,40,41,50,51]
[[00,01], [10,11], [20,21], [30,31], [40,41], [50,51]]
我需要一个步长为1的滑动窗口,窗口大小为3喜欢这个:
[[00,01,10,11,20,21], [10,11,20,21,30,31], [20,21,30,31,40,41], [30,31,40,41,50,51]]
我正在寻找一个numpy解决方案.如果您的解决方案可以参数化原始数组的形状以及窗口大小和步长,那就太好了.
我找到了这个相关的答案Using strides for an efficient moving average filter但是我没有看到如何指定那里的步长以及如何将窗口从3d折叠到连续的2d数组.这也是Rolling or sliding window iterator in Python,但是在Python中,我不确定它的效率如何.此外,它支持元素,但如果每个元素具有多个特征,则最终不会将它们连接在一起.
In [1]: import numpy as np In [2]: a = np.array([[00,01], [10,11], [20,21], [30,31], [40,41], [50,51]]) In [3]: w = np.hstack((a[:-2],a[1:-1],a[2:])) In [4]: w Out[4]: array([[ 0, 1, 10, 11, 20, 21], [10, 11, 20, 21, 30, 31], [20, 21, 30, 31, 40, 41], [30, 31, 40, 41, 50, 51]])
您可以将其写为函数,如下所示:
def window_stack(a, stepsize=1, width=3): n = a.shape[0] return np.hstack( a[i:1+n+i-width:stepsize] for i in range(0,width) )
这并不真正取决于原始数组的形状,只要a.ndim = 2.请注意,我从不在交互式版本中使用任何长度.形状的第二个维度是无关紧要的;每行可以随意长.感谢@ Jaime的建议,你可以在不检查形状的情况下完成:
def window_stack(a, stepsize=1, width=3): return np.hstack( a[i:1+i-width or None:stepsize] for i in range(0,width) )