2016-06-25 4 views
5

Ich habe ein Array:Wie akkumuliert man ein Array nach Index in numpy?

a = np.array([0,0,0,0,0,0]) 

ich ein anderes Array in jeden Index eines hinzufügen mag, während der Index mehr als ein Mal erscheinen. Ich möchte einige von jedem Index bekommen. Ich schreibe:

a[np.array([1,2,2,1,3])] += np.array([1,1,1,1,1]) 

sondern erhalten eine sein:

array([0, 1, 1, 1, 0, 0]) 

Aber was ich will, ist zu bekommen:

array([0, 2, 2, 1, 0, 0]) 

Wie dies ohne Schleife in numpy implementieren?

Antwort

9

Verwendung von reinen numpy und eine Schleife für die Vermeidung:

np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1])) 

Ausgang:

>>> a = np.array([0,0,0,0,0,0]) 
>>> np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1])) 
>>> a 
array([0, 2, 2, 1, 0, 0]) 

Bitte beachten Sie, tut dies an Ort und Stelle Substitution. Dies ist das, was von dir gewünscht wird, aber es kann nicht von zukünftigen Zuschauern gewünscht werden. Daher der Hinweis :)

+1

Ehrfürchtig. Ich habe sogar 'np.add.reduceat' angeschaut, aber ich habe nicht zu viel Zeit mit den' ufunc' Methoden verbracht, daher kenne ich die meisten nicht. Die [Dokumentation] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html) hier ist sogar perfekt ... "Für die Addition ufunc ist diese Methode äquivalent zu [ Indizes] + = b, außer dass die Ergebnisse für Elemente gesammelt werden, die mehr als einmal indiziert sind. " – mgilson

+1

Danke, genau das möchte ich. – maple

1

Sie könnten immer nur selbst iterieren. Etwas wie:

for i in [1,2,2,1,3]: 
    a[i] += 1 
+1

danke, aber ich möchte für Schleife zu vermeiden. – maple

1

Ich weiß nicht, von einem cleveren numpy vektorisiert Weg, dies zu tun ... das Beste, was ich mit oben kommen kann ist:

>>> indices = np.array([1,2,2,1,3]) 
>>> values = np.array([1,1,1,1,1]) 
>>> a = np.array([0,0,0,0,0,0]) 
>>> for i, ix in enumerate(indices): 
... a[ix] += values[i] 
... 
>>> a 
array([0, 2, 2, 1, 0, 0]) 
+0

Danke, aber ich möchte for Schleife vermeiden. – maple

+2

@maple - Ich verstehe das, aber ich weiß nicht, wie ich es machen soll. Das soll natürlich nicht heißen, dass es keine Möglichkeit gibt, dies zu tun (obwohl es das vielleicht nicht gibt). In jedem Fall reicht es manchmal aus, ein Beispiel für korrekten (funktionierenden) Code zu haben, um das Problem zu beleuchten, damit andere es besser knacken können. – mgilson

+0

@aple Überprüfen Sie meine Antwort, wenn Sie wissen möchten, wie Sie es machen können. Vielen Dank. Obwohl ich völlig einverstanden bin, Beispiele zu geben, um Probleme auf verschiedene Arten zu lösen. – oxalorg

1

Sie können wie etwas tun (unter der Annahme, für jeden Index gibt es einen korrelierten Wert):

a = np.array([0,0,0,0,0,0]) 
idxs = np.array([1,2,2,1,3]) 
vals = np.array([1,1,1,1,1]) 
for idx, val in zip(idxs,vals): 
    a[idx] += val