Gibt es eine "Begrenzungsbox" -Funktion (Slice mit Werten ungleich Null) für ein NDarray in Numpy?
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
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.