当前位置 : 主页 > 编程语言 > python >

python – M-by-N shpae numpy.ndarray的滑动窗口

来源:互联网 收集:自由互联 发布时间:2021-06-25
我有一个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]
我有一个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]]

我正在寻找一个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) )
网友评论