为 ndarrays 滚动 windows

Rolling windows for ndarrays

我有一个形状为 (30,2,2) 和 2000 个元素的 n 维数组。所以我的最终数组的形状是 (2000, 30, 2, 2)。我现在想在一个新数组中堆叠滚动的 200 个元素。所以我假设我的最终数组看起来像 (1801, 200, 30, 2, 2),其中 1800 中的每个元素都有 200 个 (30,2,2) 数组样本。如何在 python 中创建滚动 window。我试过使用 vstack 但不完全确定我如何达到我想要的结果。

import numpy as np

input = np.zeros((2000, 30, 2, 2))
desired_output = np.zeros((1801, 200, 30, 2, 2))

您可以使用 numpy.stack:

对第一个维度进行切片并将 window 大小的数组堆叠在一起
import numpy as np

a = np.zeros((2000, 30, 2, 2))

ws = 200
n = a.shape[0]

r = np.stack([a[i:i+ws] for i in range(n-ws+1)])
r.shape
(1801, 200, 30, 2, 2)

我们可以利用 np.lib.stride_tricks.as_strided based scikit-image's view_as_windows to get sliding windows and hence solve our case here. .

输出将是输入数组的视图,因此,它在运行时几乎是免费的。实施将是 -

from skimage.util.shape import view_as_windows

out = view_as_windows(input,(200,1,1,1))[...,0,0,0].transpose(0,4,1,2,3)