是否有内置的 numpy 来执行此操作?

Is there a numpy built-in to do this?

在使用 CodeSignal 进行 BoxBlur 练习时,它要求将图像矩阵拆分为 3x3 子矩阵,如下所示:

[[7,4,0,1],          [[7, 4, 0], [5, 6, 2], [6, 10, 7]] 
 [5,6,2,2],   --->   [[4, 0, 1], [6, 2, 2], [10, 7, 8]] 
 [6,10,7,8],         [[5, 6, 2], [6, 10, 7], [1, 4, 2]] 
 [1,4,2,0]]          [[6, 2, 2], [10, 7, 8], [4, 2, 0]] 

我写了下面的代码,它解决了纯 python 的问题:

def get_grid(matrix, height, width):
    for i in range(len(matrix) - height + 1):
        for j in range(len(matrix) - width + 1):
            yield [row[j:j+width] for row in matrix[i:i+height]

我还用 numpy 尝试了一些产生相同结果的东西:

# in this case the matrix come as a numpy.array
def get_grid(matrix, height, width):
    for i in range(len(matrix) - height + 1):
        for j in range(len(matrix) - width + 1):
            yield matrix[i:i+height, j:j+width]

我想知道是否有某种方式可以使用内置的 numpy 或更 pythonic 的方式产生相同的结果。

根据评论的建议回答这个问题,以便将其从未回答的队列中删除。您可以使用 np.lib.stride_tricks.sliding_window_view 来获得具有指定大小的“卷积”滑动 window 值。在你的例子中

import numpy as np

A = [[7,4,0,1],
     [5,6,2,2],
     [6,10,7,8],
     [1,4,2,0]]

res = np.lib.stride_tricks.sliding_window_view(A, (3,3)).reshape(-1, 3, 3) 

您将需要重新整形,否则生成的形状将是 (2, 2, 3, 3)