Numpy-Array aus Liste erstellen: Kann keinen dtype zuweisen

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
metallissimus
User
Beiträge: 6
Registriert: Mittwoch 5. März 2014, 19:45

Zur Sonifizierung eines Bildes (ich bin eher Künstler als Programmierer) sitze ich gerade an einer Bildanalyse.
Das Bild ist bereits segmentiert und mir liegen die Labels vor. Jetzt möchte ich die zu jedem Label gehörenden Pixelkoordinaten in ein Numpy-Array schreiben. Da ich im Vorfeld nicht weiß, wie die Struktur dieses Arrays aussieht, erstelle ich zunächst eine Liste, an die ich die Koordinaten jedes Labels in einer Schleife nach und nach anhänge.
Bei der Erstellung des Arrays aus der Liste habe ich jetzt das Problem, dass ich keinen dtype zuweisen kann, ich kriege immer folgende Fehlermeldung:

Code: Alles auswählen

ValueError: setting an array element with a sequence.
Hier der Code des entsprechenden Programmteils, die letzte Zeile verursacht den obigen Fehler:

Code: Alles auswählen

import numpy as np

img_labels = [[ 0  0  1  1  2  2  3  3  4  4  5  5]
 [ 0  0  1  1  2  2  3  3  4  4 11  5]
 [ 6  6  7  7  8  8  8  9 10 10 11  5]
 [ 6  6  7  7  8  8  9  9 10 10 10 11]
 [12 12 12 14 14  8 15  9 16 16 16 17]
 [13 13 13 20 20 14 14 15 16 16 17 17]
 [18 18 19 19 20 20 21 22 22 22 22 23]
 [18 18 19 19 20 20 21 21 22 22 23 23]]

unique_labels = np.unique(img_labels)    

coord_list = []    
    
for i in unique_labels:
    current_indices = np.argwhere(img_labels == i)
    coord_list.append(current_indices.tolist())

label_coord = np.array(coord_list, dtype = np.int64 )
Ich bin momentan ziemlich ratlos, sowohl was die Ursache als auch die Lösung des Problems angeht, könnt ihr mir weiterhelfen?
BlackJack

@metallissimus: Das ist syntaktisch falsch, also kann man das nicht ausprobieren.

Schau Dir mal `coord_list` an, insbesondere die Länge der einzelnen Elemente und verrate mal was Du *da* erwartest wie man daraus ein Array machen können soll‽ Das geht doch gar nicht.
metallissimus
User
Beiträge: 6
Registriert: Mittwoch 5. März 2014, 19:45

Mir war nicht ganz bewusst, dass man in Arrays keine Elemente unterschiedlicher Länge miteinander kombinieren kann, bzw. hatte da aus der Möglichkeit das in Listen zu tun wohl falsche Schlüsse gezogen. Außerdem lässt sich das Array (oder was auch immer label_coord dann ist) aber interessanterweise kreieren, wenn man auf die dtype-Zuweisung verzichtet.
Wenn ich in der Zeile

Code: Alles auswählen

coord_list.append(current_indices.tolist())
auf das .tolist() verzichte, kann ich sogar später wie gewünscht darauf zugreifen:

Code: Alles auswählen

 for i in unique_labels:
        current_x_min = np.amin(label_coord[i][:,1])
        x_min.append(current_x_min)
        current_x_max = np.amax(label_coord[i][:,1])
        x_max.append(current_x_max)
In der Form lässt sich label_coord aber nicht zum Indizieren nutzen, darüber bin ich überhaupt erst auf das Problem aufmerksam geworden.

Wie lässt sich das lösen? Lässt sich das überhaupt lösen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@metallissimus: ein Array besteht aus einer bestimmten Anzahl an Zeilen und Spalten, wie soll das mit unterschiedlichen Anzahl an Elementen in einer Zeile funktionieren? Was Du jetzt erzeugt hast, ist ein Vektor vom Typ Object. Das heißt, die Elemente sind ganz normale Pythonobjekte.
metallissimus
User
Beiträge: 6
Registriert: Mittwoch 5. März 2014, 19:45

Danke euch beiden für die schnelle Aufklärung!
Mit ein bisschen rumprobieren hab ich jetzt gemerkt, dass ich die Daten gar nicht unbedingt als Array brauche, sondern das wohl auch mit einer Liste funktioniert. Ich muss mich aber mal noch gründlich mit Listen und Tuples auseinandersetzen. Irgendwann holen einen dann doch die fehlenden Grundlagen ein... :oops:
Antworten