Seite 1 von 1

Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 11:39
von ThreshTalking
Hey,

ich bin gerade dabei für meine Bachelorarbeit etwas mit Python zu programmieren. Das Ganze findet im Kontext mit Bild/Videoanalyse statt, weshalb ich auf numpy arrays gestoßen bin... Nun zu meiner Frage:
Ich benutze MaskRCNN um Bilder zu analysieren, die Masken dazu werden in einem Numpy Array abgespeichert mit Shape(1080,1920,"Länge der gefundenen Instanzen"):
Also z.B. wenn in meinem Bild 10 verschiedene Instanzen gefunden würden, hätte das Numpy Array die Shape (1080,1920,10).
Der Kontext ist eigentlich auch nicht so wichtig, mein Problem besteht jetzt darin, dass ich zu diesem Array eine Extra Dimension sogesagt hinzufügen möchte, also dass ich das Array von (1080,1920,10) zu (1080,1920,11) umforme und diese 11. Schicht quasi hinzufüge.
Mein Vorgehen besteht darin, dass ich mit einer doppelten for schleife über jeden Pixel laufe und dann bei jedem Pixel diese extra Schicht hinzufügen will, das Problem ist nur, dass man dann das (beispielsweise) 10 schichtige Array nicht durch das 11 schichtige Array ersetzen kann, weil sie unterschiedliche Längen haben.
Ich habe mir schon ziemlich viel zu den Funktionen insert/append usw durchgelesen, aber irgendwie finde ich keine Lösung, gibt es eventuell die Möglichkeit mit Insert an konkreten stellen im Mehrdimensionalen Array meine neuen Informationen dann hinzuzufügen?
z.B. dass ich direkt den Pixel [520][400] adressieren kann?

Vielen Dank schonmal im Vorraus für die Hilfe :)

Viele Grüße
ThreshTalking

Re: Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 13:10
von Sirius3
@ThreshTalking: nein, Du kannst natürlich nur komplette Schichten hinzufügen. Also erst eine neue Schicht erstellen (am besten ohne for-Schleifen, aber wenn es wirklich nicht anders geht auch mit for-Schleifen). Das beste ist np.concatenate, mit der Du zu den 10 Schichten eine 11. hinzufügen kannst.

Zeig doch Beispielcode, wie Du das versucht hast, dann können wir konkreter helfen.

Re: Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 13:14
von __blackjack__
@ThreshTalking: Du kannst mit `numpy.dstack()` die letzte Dimension recht einfach um Werte erweitern. Zum Beispiel mit einer Schicht die nur aus 0en besteht, und die kann man dann durch andere Werte ersetzen.

Allerdings riecht das einzelne ersetzen von Werten in Python-Schleifen über einzelne Pixel komisch. Wie sollen denn die Werte dieser neuen Schicht gebildet werden? Man würde da eher versuchen Numpy auch tatsächlich zu benutzen und diese neue Schicht mit Numpy-Mitteln zu berechnen, und dann wenn sie fertig ist, mit `dstack()` die erweiterte Daten zu erzeugen.

Re: Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 18:00
von ThreshTalking
Danke euch schonmal für die schnellen Antworten :)
Hier ist mein Beispielcode, ich hab versucht nochmal ein wenig das Problem zu erläutern:

https://imgur.com/a/Vm5IkWp (Das Bild einfügen hat leider nicht wirklich funktioniert, deshalb ein Link sorry).

Re: Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 18:23
von Sirius3
Statt eines Bildes poste Deinen Code bitte als Text hier im Forum in Code-Tags </>.

Einfach die for-Schleifen weg lassen, dann paßt das schon.

Re: Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 20:06
von ThreshTalking
Ich habe mich grad nochmal drangesetzt:
Der Tipp von dir concatenate und eine "leere" Schicht sogesagt zu verwenden, in die ich dann meine Werte speichere hat funktioniert :)
(Hatte erst ein wenig Probleme mit dem axis Parameter)

Code: Alles auswählen

                arr = np.zeros((1080,1920, 1), dtype=bool)
                for k in range(0, 1080):
                    for l in range(0, 1920):
                        arr[k][l]=frames[i]['masks'][k][l][missingID]

                newMasks = np.concatenate((frames[i + 1]['masks'], arr), axis=2)
                newRois = np.insert(frames[i + 1]['rois'], len(frames[i + 1]['scores']), frames[i]['rois'][missingID], axis=0)
                newScores = np.insert(frames[i + 1]['scores'], len(frames[i + 1]['scores']),frames[i]['scores'][missingID], axis=0)
                newIDs = np.insert(frames[i + 1]['class_ids'], len(frames[i + 1]['scores']),frames[i]['class_ids'][missingID], axis=0)

                frames[i + 1]['rois'] = newRois
                frames[i+1]['scores']=newScores
                frames[i+1]['class_ids']=newIDs
                frames[i + 1]['masks'] = newMasks
                lostframecount+=1
Cooles Forum auf jedenfall und danke für die schnelle Hilfe :)

Mfg
ThreshTalking

Re: Numpy Mehrdimensionale Arrays bearbeiten

Verfasst: Donnerstag 6. Februar 2020, 20:37
von Sirius3
Wie schon geschrieben, sind die for-Schleifen überflüssig. Du kopierst hier Pixel für Pixel ein Array in ein anderes, was auch direkt geht. insert, wenn man etwas anfügen will, ist die falsche Methode.

Namenskonvention in Python vor Variablennamen ist klein_mit_unterstrich.
Statt Code zu kopieren benutzt man passende Muster, hier eine for-Schleife.

Code: Alles auswählen

old_frame = frames[i]
next_frame = frames[i+1]
next_frame['masks'] = np.concatenate([next_frame['masks'], old_frame['masks'][..., missing_id:missing_id+1]], axis=2)
for key in ['rois', 'scores', 'class_ids']:
    next_frame[key] = np.concatenate([next_frame[key], old_frame[key][missing_id:missing_id+1]], axis=0)
lostframecount += 1