2016-04-19 12 views
0

Wenn ich numpy verwende, kann ich zwei 1D-Array durch Schreiben Summe einfach:Wie Argumente einer Liste von Objekten auf eine pythonische Weise zusammenzufassen?

C = A + B 

Wenn ich eine Liste von Objekten, und alle Objekte in der Liste sind von der gleichen Klasse und hat alle drei Argumente (r, v und a). Wenn ich berechnen möchte, sagen wir r = r + v +0.5*a für alle Objekte in der Liste: Wie schreibe ich dies in einer Zeile wie ich würde in numpy wissen, dass alle meine Objekte in einer Liste L sind?

Etwas Ähnliches Ich denke:

L.r += L.v + 0.5*L.a 
+2

Dies (Vektorisierung) ist einer der Hauptgründe für die Verwendung von "numpy over" -Listen bei der Durchführung von arthetischen Tests. Soweit ich weiß, können Sie dies nicht in nativem Python tun, ohne eine for-Schleife oder ein Listenverständnis aufzurufen. Aus Neugier, warum willst du für solche Operationen außerhalb von Numpy arbeiten? –

+0

Wenn ich numpy.asarray auf einer Objektliste verwende, kann ich die Argumente der Objekte auf dem numpy.array direkt vektorisieren? Es sagt mir AttributeError: 'numpy.ndarray 'Objekt hat kein Attribut' r ' – Phaune

+0

@Phaune, was Sie tun müssen, ist 3 numpy Arrays zu erstellen, eine für jede Eigenschaft, tun Sie die vektorisierte Operation (die viel effizienter sein wird) und legen Sie dann die Werte in der ursprünglichen Liste von Objekten. –

Antwort

1

Wenn Sie nicht mit zwei Linien überleben können:

[setattr(item,'r',item.r + item.v + 0.5 * item.a) for item in L] 
+0

Aber ich würde wirklich @Adam Hughes kommentieren, bevor Sie dies tun. –

0

Wenn Sie mit zwei Linien versuchen, dies überleben:

for item in L: 
    item.r += item.v + 0.5 * item.a 
2

Es ist ein wenig unklar, was die Ausgabe, die Sie suchen. Suchen Sie eine Liste von Zahlen:

[x.r + x.v + .5*x.a for x in L] 

Die Summe von denen?

sum([x.r + x.v + .5*x.a for x in L]) 

Oder die Objekte selbst ändern?

runningSum=0 
def mod(obj): 
    # How complicated this function is depends on what your trying to accomplish. 
    obj.r = runningSum + obj.r + obj.v + .5*obj.a 
    runningSum = obj.r 
    return obj 

map(mod,L) 
+0

Ich glaube nicht, dass die Frage etwas über die gewünschte Ausgabe aussagt, der Fragesteller möchte nur eine anständige Funktionalität replizieren. –

1

Während keine formale Antwort, würde Ich mag Ihre Neugier holen und Sie eine Welt der Möglichkeiten von Ihrer Frage, die sie machen vorstellen. Wenn Sie numpy aus irgendeinem Grund nicht verwenden möchten und Sie sich nur fragen, wie Sie die Summe aller Elemente in einer Liste in nur einer Zeile zusammenfassen, sollten Sie die Operation zwischen Listen neu definieren. Dies kann durch die Definition eine sehr einfache Klasse wie die folgenden erreicht werden:

class array(): 
    def __init__(self, mylist): 
     self.list = mylist 
     return 
    def __add__(self, other): 
     for i in xrange(len(self.list)): 
      self.list[i] += other.list[i] 
     return array(self.list) 
    def __repr__(self): 
     return "%s" % (self.list) 

Sie können sehen, dass die Klasse instanziiert wird eine Python-Liste verwenden, und dann definiere ich die __add__ Methode, die im Wesentlichen an, wie die Array Objekte interagieren unter dem Symbol +. Natürlich gibt es hier viel Platz, um es zu verbessern und nach Ausnahmen zu suchen, aber dies soll nur die Tatsache hervorheben, dass Sie definieren können, was Sie wollen. Sie können sehen, dass das Hinzufügen von zwei Array-Objekten ein neues Array-Objekt zurückgibt, das wir hinzufügen können.

für Sie zu sehen, wie es funktioniert, unten ich ein sehr einfaches Beispiel schreiben:

A = array([1,2,3,4,5]) 
B = array([3,2,4,5,6]) 
C = A+B 

Dann, wenn Sie C in der Eingabeaufforderung eingeben, werden Sie

[4, 4, 7, 9, 11] 

die wiedersehen ist eine Array-Klasse.

Verwandte Themen