Numpy Array von Objektattributen

Diese Frage hat hier schon eine Antwort:

  • Erhalten von Attributen aus Arrays von Objekten in NumPy 2 Antworten

Ich habe ein mehrdimensionales Array von Objekten, so etwas wie:

  • SWIG kann den Typedef-Typ nicht korrekt umwandeln
  • Python-Listen / Arrays: Deaktivieren Sie die negativen Indexing-Wrap-around in Slices
  • Python NumPy - Wie man Array nicht druckt, zeigt den vollständigen Satz an
  • Vergleichen Sie den aktuellen Pixelwert mit dem vorherigen auf numpy array
  • Lesen Sie Daten in strukturiertes Array mit mehreren Dtypen
  • Was ist der schnellste Weg, um ein Integer-Array in Python zu initialisieren?
  • a = np.array([obj1,obj2,obj3]) 

    Die Objekte sind Instanzen einer Klasse, die mehrere Attribute hat. Sagen wir, einer von ihnen ist Höhen und einer von ihnen ist Längen. Um das entsprechende mehrdimensionale Array von Längen und Höhen zu bekommen, mache ich:

      lengths = np.array([obj1.length,obj2.length,obj3.length]) heights = np.array([obj1.height,obj2.height,obj3.height]) 

    Das fängt an, meinen Code ganz zu stören. Gibt es eine effizientere Art, dies zu tun? Zum Beispiel hatte ich so etwas wie

      heights = a.height 

    Im Sinn aber offensichtlich funktioniert es nicht, weil a ein Array meiner Objekte und nicht mein Objekt ist. Aber gibt es etwas Ähnliches, das ich tun kann, das ist effizient und pythonisch? Ich habe so etwas probiert

      for x in np.nditer(a,flags=['refs_ok']): print x.length 

    Um zu sehen, was passieren würde, aber es funktioniert nicht, weil nditer ein Tupel irgendwie zurückgibt.

    Irgendwelche Ideen?

    One Solution collect form web for “Numpy Array von Objektattributen”

    Sie können die Funktion vektorisieren :

     >>> import numpy >>> >>> class Obj(object): ... def __init__(self, x, y): ... self.x = x ... self.y = y ... >>> arr = numpy.array([Obj(1, 2), Obj(3, 4), Obj(5, 6)]) >>> >>> vectorized_x = numpy.vectorize(lambda obj: obj.x) >>> >>> vectorized_x(arr) array([1, 3, 5]) 

    Obwohl ich nicht sicher bin, ob Sie wirklich ein NumPy Array von Python-Objekten an erster Stelle speichern sollten. Vectorize ist nicht effizienter als eine Pythonschleife. Es wäre effizienter, ein (n + 1) -D-Array zu speichern, da wir den Inhalt einfach durch das Slicing, das eine native Operation ist, z

     >>> a = numpy.array([[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10), (11, 12)], [(-13, -14), (-15, -16), (-17, -18)]]) >>> a[:,:,0] array([[ 1, 3, 5], [ 7, 9, 11], [-13, -15, -17]]) >>> a[:,:,1] array([[ 2, 4, 6], [ 8, 10, 12], [-14, -16, -18]]) 
    Python ist die beste Programmiersprache der Welt.