给定一个大小为 (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)
假设你打错字了并且意思是
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]