Gibt es eine "Begrenzungsbox" -Funktion (Slice mit Werten ungleich Null) für ein NDarray in Numpy?

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

Frage

Ich habe es mit Arrays zu tun, die über Numpy.Array () erstellt wurden, und ich muss Punkte auf eine Leinwand zeichnen, die ein Bild simuliert. Da es um den zentralen Teil des Arrays, der die aussagekräftigen Daten enthält, viele Nullwerte gibt, möchte ich das Array "schneiden" und Spalten löschen, die nur Nullen und Zeilen enthalten, die nur Nullen enthalten.

Daher würde ich gerne eine native Numpy-Funktion oder sogar einen Code-Snippet kennenlernen oder ein "Begrenzungsfeld" finden, um nur den datenhaltigen Teil des Arrays zu schneiden.

(Da es sich um eine konzeptionelle Frage handelt, habe ich keinen Code gestellt. Tut mir leid, wenn ich sollte, ich bin sehr frisch, um so zu posten.)

Danke fürs Lesen

War es hilfreich?

Lösung

Der Code unten, von Diese Antwort Läuft in meinen Tests am schnellsten:

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]

Die akzeptierte Antwort verwendet argwhere arbeitete aber langsamer. Ich vermute, es liegt daran argwhere Zuteilt ein riesiges Ausgangsarray von Indizes. Ich habe auf einem großen 2D -Array (ein 1024 x 1024 Bild mit ungefähr 50 x 100 ungleich Null -Region) getestet.

Andere Tipps

Dies sollte es tun:

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]

Etwas wie:

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

Die resultierenden Arrays sind 1D Boolian -Arrays. Schleifen Sie von beiden Enden an, um den "Begrenzungsbox" zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top