Dado um array 2D de tamanho (W,H), por exemplo (3,4). Você pode pensar em cada ponto nesse array 2D como um canto de um patch retangular. Eu quero dividir esse array em seus patches individuais, conforme mostrado no exemplo abaixo. A ordem pela qual essa divisão acontece é linha por linha e para cada patch começamos do pixel superior esquerdo e movemos no sentido anti-horário. Ou seja, o patch 1 é [A[0,0],A[1,0],A[1,1],A[0,1]]. Então o patch dois é [A[0,1],A[1,1],A[1,2],A[0,2]]. O número de patches é (w-1) (h-1) e a saída final é outro array 2D de tamanho ((w-1) ( h-1),4) (por exemplo, (6,4) aqui), onde 6 é o número de patches e 4 são valores de array para os cantos do patch no sentido anti-horário, conforme descrito acima.
Agora minha pergunta é sobre a maneira mais eficiente de produzir esses patches em python usando apenas funções python e numpy.
Muito obrigado.
Posso escrever um loop duplo for que faça o trabalho conforme abaixo, mas estou pensando se existe um algoritmo melhor que possa fornecer um desempenho mais rápido:
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]
patches=[]
for y in range(H-1):
for x in range(W-1):
patches.append([A[0+y,0+x],A[1+y,0+x],A[1+y,1+x],A[0+y,1+x]])
patches =np.array(patches)
print(patches)
Supondo que você cometeu um erro de digitação e quis dizer
Então você pode obter o mesmo resultado com:
Comparação (o meu é ~3x mais lento naquele exemplo de brinquedo, mas ~10x mais rápido em matrizes maiores):