一尘不染

M乘N形状的滑动窗口numpy.ndarray

python

我有一个形状为(6,2)的numpy数组

[[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]]

我正在寻找一种解决方案。如果您的解决方案可以参数化原始数组的形状以及窗口大小和步长大小,那就太好了。


阅读 203

收藏
2020-12-20

共1个答案

一尘不染

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) )
2020-12-20