如何创建一个与 numpy 数组重叠 50% 的滑动窗口? [复制]

Posted

技术标签:

【中文标题】如何创建一个与 numpy 数组重叠 50% 的滑动窗口? [复制]【英文标题】:How do I create a sliding window with a 50% overlap with a numpy array? [duplicate] 【发布时间】:2018-01-25 14:19:38 【问题描述】:

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

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 函数中执行此操作?

【问题讨论】:

看起来像基本的 numpy 用法。你尝试了什么?您显然需要创建新数组,所以您是否尝试了一个列表理解,其中 start-index 是由 python 的 range() 和 step 控制的? 您想要四个独立的阵列而不是单个 4x4 阵列吗?后者可能更方便,只是as_strided的一个应用。 我想要后者 对于这个用例的一些更一般的 as_strided 示例:skimage's view_as_windows。 【参考方案1】:

你想要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,否则它是内存共享视图。

【讨论】:

我应该在哪里添加copy() 为澄清而编辑的答案,还修复了偏移量,因为这仅适用于您之前的玩具问题 Expected type 'Optional[Iterable[int]],得到'int'而不是strides=st 你的意见是什么a 我输入了a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

以上是关于如何创建一个与 numpy 数组重叠 50% 的滑动窗口? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

光滑的滑块图像重叠和损坏的按钮

WPF中如何让一个元素与另一个元素重叠?

检查两个 3D numpy 数组是不是包含重叠的 2D 数组

numpy如何沿维度拆分数组?

创建一个基于空的numpy数组并附加现有数组

如何从填充零的 3 维 numpy 数组创建 4 维 numpy 数组?