2016-10-11 10 views
1

Ich habe eine Liste von Indizes (Liste (int)) und eine Liste von Summierungsindizes (Liste (Liste (int)). Gegeben ein 2D numpy Array, muss ich die Summe über Indizes finden die zweite Liste für jede Spalte und fügen sie sie in den entsprechenden Indizes in der ersten Spalte gibt es eine Möglichkeit, dies vektorisieren Hier wird der normale Code ist:Numpy vektorisieren Summe über Indizes

indices = [1,0,2] 
summing_indices = [[5,6,7],[6,7,8],[4,5]] 
matrix = np.arange(9*3).reshape((9,3)) 
for c,i in enumerate(indices): 
    matrix[i,c] = matrix[summing_indices[i],c].sum()+matrix[i,c] 

Antwort

2

Hier ist ein fast * vektorisiert Ansatz np.add.reduceat -

.?
lens = np.array(map(len,summing_indices)) 
col = np.repeat(indices,lens) 
row = np.concatenate(summing_indices) 
vals = matrix[row,col] 
addvals = np.add.reduceat(vals,np.append(0,lens.cumsum()[:-1])) 
matrix[indices,np.arange(len(indices))] += addvals[indices.argsort()] 

Bitte beachten Sie, dass dies einige Setup hat Overhead, also wäre es am besten geeignet für 2D Eingangsarrays mit einer guten Anzahl von Spalten, während wir entlang der Spalten iterieren.

*: Fast wegen der Verwendung von map() am Anfang, aber rechnerisch sollte das vernachlässigbar sein.

+0

Es gibt mir den Fehler: TypeError: Array-Daten können nicht von Dtype ('O') zu Dtype ('Int64') nach der Regel 'sicher' in der zweiten Zeile. Meinst du zu schreiben lens = np.array (Liste (Karte (len (summing_indices))) ? – Aditya369

+0

@ Aditya369 Versuchen Sie: 'lens = np.array (Karte (len, summing_indices)). Astype (int)' . – Divakar

+0

Es gibt mir TypeError: int() Argument muss eine Zeichenfolge sein, ein Byte-ähnliches Objekt oder eine Zahl, nicht 'Karte' – Aditya369

Verwandte Themen