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:

  • Wie fügt man eine Spalte zu einem Pandas-Dataframe aus Arrays der n-vorhergehenden Werte einer anderen Spalte hinzu?
  • Lesen / Schreiben von Python-Liste von / zu Binärdatei
  • Warum eingebaute Funktionen wie abs funktioniert auf numpy Array?
  • Bekomme numpy Array von Pygame
  • Python - Ersetzen Sie die Daten eines Arrays um 2 Werte eines zweiten Arrays
  • Warum ist numpy.any so langsam über große Arrays?
  • 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.