2016-06-25 37 views
5

Ho un array:Come accumulare un array per indice in numpy?

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

voglio aggiungere qualche altro array in ogni indice di una, mentre l'indice può apparire più di una volte. Voglio ottenere alcuni di ciascun indice. Scrivo:

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

ma ottenere un di essere:

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

Ma quello che voglio è quello di ottenere:

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

Come implementare questo NumPy, senza per il ciclo?

risposta

9

Utilizzando puro numpy, ed evitando un ciclo:

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

uscita:

>>> 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]) 

Si prega di notare, questo fa la sostituzione sul posto. Questo è ciò che desideri da te, ma potrebbe non essere desiderato dai futuri spettatori. Quindi la nota :)

+1

Fantastico. Ho anche guardato 'np.add.reduceat', ma non ho speso troppo tempo con i metodi' ufunc', quindi non ne conosco la maggior parte. La [documentazione] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html) qui è addirittura perfetta ... "Per aggiunta ufunc, questo metodo è equivalente a [ indici] + = b, eccetto che i risultati vengono accumulati per gli elementi che sono indicizzati più di una volta " – mgilson

+1

Grazie, è esattamente ciò che voglio. – maple

1

Si potrebbe sempre solo iterare te stesso. Qualcosa di simile:

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

grazie, ma voglio evitare per ciclo. – maple

1

non so di un modo vettorializzare NumPy intelligente per fare questo ... il meglio che può venire in mente è:

>>> 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

Grazie, ma voglio evitare il ciclo. – maple

+2

@maple: lo capisco, ma non conosco un modo per farlo. Ovviamente, questo non vuol dire che non ci sia un modo per farlo (anche se potrebbe non esserlo). In ogni caso, a volte avere un esempio di codice corretto (funzionante) è sufficiente per illuminare il problema per gli altri a fare un crack migliore. – mgilson

+0

@maple Controlla la mia risposta se sei curioso di sapere come farlo. Grazie. Anche se sono completamente d'accordo nel fornire esempi per risolvere i problemi in modi diversi. – oxalorg

1

Si può fare qualcosa di simile (supponendo per ogni indice è un valore correlato):

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