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:

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?

  • Mit python's eval () vs. ast.literal_eval ()?
  • Django allauth Beispiel [Errno 61] Verbindung abgelehnt
  • Wie man das tkinter "scrolledtext" Modul kodiert
  • IP-Adresse regex python
  • Verwenden von Py_buffer und PyMemoryView_FromBuffer mit verschiedenen Itemsizes
  • Python Float Gleichheit Weirdness
  • Python-pptx slide.shapes.add_picture () nicht erkennen Bilddateien
  • Pandas gesetztes Zellenformat in Excel-Schriftsteller
  • 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.