是否有内置的 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)
。
在使用 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)
。