通过滑动 window 重复 Numpy 数组

Repeat Numpy array by a sliding window

来自以下形状数组 (6, 3)

>>> arr
[
    [1, 0, 1],
    [0, 0, 2],
    [1, 2, 0],
    [0, 1, 3],
    [2, 2, 1],
    [2, 0, 2]
]

我想根据 n=4 的滑动 window 重复值,给出形状为 (6-n-1, n, 3):

的新数组
>>> new_arr
[
    [
        [1, 0, 1],
        [0, 0, 2],
        [1, 2, 0],
        [0, 1, 3]
    ],
    [
        [0, 0, 2],
        [1, 2, 0],
        [0, 1, 3],
        [2, 2, 1]
    ],
    [
        [1, 2, 0],
        [0, 1, 3],
        [2, 2, 1],
        [2, 0, 2]
    ]
]

使用循环相对简单,但如果初始数组中有几百万个值(而不是本例中的 6 个),它会变得非常慢。

是否有使用 Numpy 原语更快地达到 new_arr 的方法?

您可以使用 NumPy,特别是 this 函数(仅限 NumPy >= 1.20.0):

from numpy.lib.stride_tricks import sliding_window_view

new_arr = sliding_window_view(arr, (n, arr.shape[1])).squeeze()