C'è una funzione “scatola di delimitazione” (fetta con i non-valori zero) per un ndarray in NumPy?

StackOverflow https://stackoverflow.com/questions/4808221

Domanda

ho a che fare con gli array creati tramite numpy.array (), e ho bisogno di disegnare i punti su una tela simulando un'immagine. Poiché v'è un sacco di valori zero attorno alla parte centrale della matrice che contiene i dati significativi, vorrei "trim" dell'array, cancellando colonne che contengono solo zeri e righe che contengono solo zeri.

Quindi, vorrei sapere di qualche funzione NumPy nativo o anche un frammento di codice per "tagliare" o trovare un "rettangolo di selezione" per fetta solo i dati contenenti una parte della matrice.

(dal momento che è una domanda concettuale, non ho messo alcun codice, scusa se dovrei, io sono molto fresco al distacco a SO.)

Grazie per la lettura

È stato utile?

Soluzione

Il codice qui sotto, da corre questa risposta più veloci nel mio test:

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 risposta accettata utilizzando argwhere ha funzionato, ma correva più lento. Mia ipotesi è, è perché argwhere alloca una matrice di uscita gigante di indici. Ho testato su un grande array 2D (immagine 1024 x 1024, con circa un diverso da zero regione 50x100).

Altri suggerimenti

Questo dovrebbe farlo:

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]

Qualcosa di simile:

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

Le matrici risultanti saranno 1D array booleani. Loop su di loro da entrambe le estremità per trovare il 'rettangolo di selezione'.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top