在Python中将二维数组分成逆时针补丁的最快方法

问题描述 投票:0回答:1

给定一个大小为 (W,H) 的二维数组,例如 (3,4)。您可以将该二维数组中的每个点视为矩形面片的一个角。我想将该数组分成单独的补丁,如下面的示例所示。这种划分发生的顺序是逐行的,对于每个补丁,我们从左上角的像素开始并逆时针移动。表示补丁 1 为 [A[0,0],A[1,0],A[1,1],A[0,1]]。然后补丁二是 [A[0,1],A[1,1],A[1,2],A[0,2]]。补丁的数量是 (w-1)(h-1),最终输出是另一个大小为 ((w-1)(h-1),4) 的二维数组(例如这里的 (6,4) ) ,其中 6 是面片数量,4 是面片角的逆时针数组值,如上所述。

现在我的问题是关于仅使用 python 函数和 numpy 在 python 中生成这些补丁的最有效方法。

非常感谢。

我可以编写一个双 for 循环来完成如下工作,但我想知道是否有更好的算法可以提供更快的性能:

import numpy as np
A=np.array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
H=A.shape[0]
W=A.shape[1]
grids=[]
for y in range(H):
    for x in range(W):
       grids.append([A[0+y,0+x],A[1+y,0+x],A[1+y,1+x],A[0+y,1+x]])


grids=np.array(grids)
print(grids)
python algorithm image recursion combinations
1个回答
0
投票

假设你打错字了并且意思是

for y in range(H-1):
    for x in range(W-1):

然后你可以得到相同的结果:

i = np.array([0,1,1,0])
j = np.array([0,0,1,1])

h, w = np.meshgrid(np.arange(H-1), np.arange(W-1), indexing='ij')
h = h.flatten()[:,None]+i
w = w.flatten()[:,None]+j
A[h,w]
© www.soinside.com 2019 - 2024. All rights reserved.