如何使用numpy数组创建一个具有50%重叠的滑动窗口?

9

假设我有一个这样的数组:

array([1, 2, 3, 4, 5, 5, 7, 8, 9, 10])

我想将其更改为

array([1, 2, 3, 4]), array([3, 4, 5, 6]), array([5, 6, 7, 8]), array([7, 8, 9, 10])

这里窗口大小为4,步幅为2

如何在Python函数中实现?


1
看起来是基本的numpy用法。你尝试了什么?显然你需要创建新的数组,所以你是否尝试过使用列表推导式,其中起始索引由Python的range()函数控制步长? - sascha
你想要四个单独的数组而不是一个4x4的数组吗?后者可能更方便,只需要使用as_strided函数即可。 - Alex Riley
我想要后者。 - user2398046
以下是针对此用例的更一般的 as_strided 示例:skimage 的 view_as_windows - sascha
1个回答

16

你想要使用numpy.lib.stride_tricks.as_strided

def window(a, w = 4, o = 2, copy = False):
    sh = (a.size - w + 1, w)
    st = a.strides * 2
    view = np.lib.stride_tricks.as_strided(a, strides = st, shape = sh)[0::o]
    if copy:
        return view.copy()
    else:
        return view

Out[]: 
array([[ 1,  2,  3,  4],
       [ 3,  4,  5,  6],
       [ 5,  6,  7,  8],
       [ 7,  8,  9, 10]])

如果您想要写入窗口数组,请确保将copy=True,否则它将作为内存共享视图。


Expected type 'Optional[Iterable[int]], got 'int' insteadforstrides=st` - user2398046
你的输入 a 是什么? - Daniel F
在我的电脑上可以工作。你复制了整个函数吗? - Daniel F
我复制了整个函数。不过这只是一个警告,所以它可能会起作用。 - user2398046
所以,对于变量 a,我传入了一个 DataFrame.values,而且这个 Data Frame 的形状是 (540, 3)。但是我遇到了错误:ValueError: mismatch in length of strides and shape。我该如何解决这个问题? - user2398046
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接