2017-10-09 4 views
0

Angenommen, ich habe eine Reihe von Indizes:Summe indizierter numpy Arrays

I=[0 1 2 3 0 3] 

Und Array von Werten:

W=[w0, w1, w2, w3] 

Wie kann ich ein Array X mit vektorisiert numpy Ausdrücke erzeugt wie folgt erstellen:

X = np.zeros(I.max() + 1) 
for i in range(len(I)): 
    X[I[i]] += W[I[i]] 

im obigen Beispiel X=[w0+w0, w1, w2, w3+w3]

+1

Ist 'I' sortiert? – Psidom

+0

@Psidom Es ist nicht, aber es ist nicht zu schwierig, es zu sortieren, Ergebnis wird sich nicht ändern; Kennen Sie die Lösung mit dem sortierten 'I'? – DikobrAz

+1

Können Sie Ihr Ergebnis mit dem aktualisierten 'I' aktualisieren? Ich bin mir nicht sicher, was Sie jetzt tun wollen. – Psidom

Antwort

1

mit reproduzierbaren Objekte starten

>>> I = np.r_[0, 1, 2, 3, 0, 3] 
>>> W = np.r_[60, 50, 40, 30, 20, 10] 
>>> M = W[I] 

Dann beachten Sie, dass man hat

>>> W[I] 
array([60, 50, 40, 30, 60, 30]) 
>>> W[W[I]==W] 
array([60, 50, 40, 30]) 
>>> np.unique(W[I], return_counts=True)[1] 
array([2, 1, 1, 2]) 

Schließlich was


Lassen Sie uns

>>> W[M==W]*np.unique(M, return_counts=True)[1] # X 
array([120, 50, 40, 60]) 
über das Tun (fast) zu tun, dass mit Streichern

>>> W = np.array(['w0', 'w1', 'w2', 'w3', 'w4', 'w5']) 
>>> M = W[I] 
>>> M 
array(['w0', 'w1', 'w2', 'w3', 'w0', 'w3'], dtype='|S2') 
>>> W[M==W] 
array(['w0', 'w1', 'w2', 'w3'], dtype='|S2') 
>>> np.unique(W[I], return_counts=True)[1] 
array([2, 1, 1, 2]) 

Welche geistig führt zu betrachten

>>> [2*'w0', 'w1', 'w2', 2*'w3'] 
+0

aber Sie haben gegeben Antwort auf die neuesten Fragen, scheint Arbeit, nur versuchen, es zu überprüfen – DikobrAz

+0

Ihre Antwort entspricht der neuesten Frage, nicht die ursprüngliche, seit [120, 50, 40, 60] == [w0 + w0, w1, w2, w3 + w5], nicht die [w0 + w4, w1, w2, w3 + w5], macht also wahrscheinlich Sinn, deinen Kommentar am Anfang zu entfernen – DikobrAz

+0

, obwohl es nicht funktioniert, wenn W keine eindeutigen Einträge hat – DikobrAz