Numpy Mehrdimensionale Arrays bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ThreshTalking
User
Beiträge: 3
Registriert: Donnerstag 6. Februar 2020, 11:23

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ThreshTalking
User
Beiträge: 3
Registriert: Donnerstag 6. Februar 2020, 11:23

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).
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
ThreshTalking
User
Beiträge: 3
Registriert: Donnerstag 6. Februar 2020, 11:23

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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
Antworten