función column change array python arrays numpy trim bounding

python - column - ¿Existe una función de "cuadro delimitador"(sector con valores distintos de cero) para un ndarray en NumPy?



reshape numpy array 1d to 2d (3)

Estoy tratando con arreglos creados a través de numpy.array (), y necesito dibujar puntos en un lienzo que simula una imagen. Como hay una gran cantidad de valores cero alrededor de la parte central de la matriz que contiene datos significativos, me gustaría "recortar" la matriz, borrando columnas que solo contienen ceros y filas que solo contienen ceros.

Entonces, me gustaría saber si hay alguna función numpy nativa o incluso un fragmento de código para "recortar" o encontrar un "cuadro delimitador" para cortar solo la parte que contiene datos de la matriz.

(Dado que es una pregunta conceptual, no puse ningún código, lo siento si debería, estoy muy fresco para publicar en SO.)

Gracias por leer


Algo como:

empty_cols = sp.all(array == 0, axis=0) empty_rows = sp.all(array == 0, axis=1)

Las matrices resultantes serán matrices boolianas 1D. Bucle en ambos extremos para encontrar el ''cuadro delimitador''.


Esto debería hacerlo:

from numpy import array, argwhere A = array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]) B = argwhere(A) (ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1 Atrim = A[ystart:ystop, xstart:xstop]


El código a continuación, de esta respuesta corre más rápido en mis pruebas:

def bbox2(img): rows = np.any(img, axis=1) cols = np.any(img, axis=0) ymin, ymax = np.where(rows)[0][[0, -1]] xmin, xmax = np.where(cols)[0][[0, -1]] return img[ymin:ymax+1, xmin:xmax+1]

La respuesta aceptada usando argwhere funcionó, pero corrió más lento. Supongo que es porque argwhere asigna una matriz de índices de salida gigante. Probé en una gran matriz 2D (una imagen de 1024 x 1024, con aproximadamente una región distinta de cero de 50x100).