Tengo un numpy array que contiene etiquetas. Me gustaría calcular un número para cada etiqueta según su tamaño y cuadro delimitador. ¿Cómo puedo escribir esto de manera más eficiente para que sea realista de usar en matrices grandes (~ 15000 etiquetas)?¿Cómo puedo mejorar la eficiencia de este numpy loop?
A = array([[ 1, 1, 0, 3, 3],
[ 1, 1, 0, 0, 0],
[ 1, 0, 0, 2, 2],
[ 1, 0, 2, 2, 2]])
B = zeros(4)
for label in range(1, 4):
# get the bounding box of the label
label_points = argwhere(A == label)
(y0, x0), (y1, x1) = label_points.min(0), label_points.max(0) + 1
# assume I've computed the size of each label in a numpy array size_A
B[ label ] = myfunc(y0, x0, y1, x1, size_A[label])
¿Qué tan grande es 'A' en el caso de uso real? –
Ballpark 7000x9000 – ajwood
¿Hizo algunos perfiles para ver cuál de sus declaraciones es la que le está frenando? Tal vez sea la función 'myfunc' la que probablemente podría ser parallizada guardando y0, x0, y1, x1 en matrices separadas saliendo del ciclo y llamando solo a la función una vez. De lo contrario, si la velocidad realmente cuenta, es posible que desee ver si vale la pena hacer algún código C. Encontré cython para ser realmente cómodo cuando se trabaja con matrices numpy. –