首页 > 解决方案 > 在 3d numpy 数组中创建滚动/移动窗口

问题描述

我目前使用以下代码创建一个 4d 数组,该数组由 3d 数组中每个栅格层的移动窗口组成(维度是:时间、x、y)。

import numpy as np
import progressbar
import copy

def moving_window_array(array, window_size, overlap):
    sz = array.itemsize
    shape = array.shape
    array = np.ascontiguousarray(array)

    strides = (sz * shape[1] * (window_size - overlap),
               sz * (window_size - overlap), sz * shape[1], sz)
    shape = (int((shape[0] - window_size) / (window_size - overlap)) + 1, int(
        (shape[1] - window_size) / (window_size - overlap)) + 1, window_size, window_size)

    return np.lib.stride_tricks.as_strided(array, strides=strides, shape=shape).reshape(-1, window_size, window_size)


def rolling_3d_window(arr, ws, ol, dim=0):
    bar = progressbar.ProgressBar(maxval=arr.shape[dim], widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()]) 
    bar.start()
    bar_iterator = 0
    mvwd_out = []
    for i in range(0, arr.shape[dim]):
        mvwd = moving_window_array(arr[i], window_size=ws, overlap=ol)
        mvwd = np.reshape(mvwd,(1,mvwd.shape[0],mvwd.shape[1], mvwd.shape[2]))
        mvwd_out.append(mvwd)
        bar.update(bar_iterator+1)
        bar_iterator += 1
    return(mvwd_out)
#Testing:
test_arr = np.random.randint(0, 100, size=(30, 10, 10))
test_out = rolling_3d_window(test_arr, 3, 2)
test_out = np.array(test_out)

众所周知,for 循环是代码中成本最高的部分。现在我想知道是否有可能使大步前进给我没有for循环的移动窗口。提前感谢您的帮助。

编辑:@hpaulj 让我意识到 np.append 不是在 for 循环中使用的最佳选择。我将代码相应地调整为列表。这显着加快了代码速度,但使用了更多内存。然而,问题仍然存在。

标签: pythonpython-3.xnumpynumpy-ndarray

解决方案


推荐阅读