2016-06-25 61 views
5

Ben bir dizi var:Numune dizine göre indekste nasıl biriktirilir?

Ben endeks birden fazla kez görünebilir ederken, bir her endeksi içine başka dizi eklemek istediğiniz
a = np.array([0,0,0,0,0,0]) 

. Her indeksin bir kısmını almak istiyorum.

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

ama olmak olsun: Yazıyorum

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

Ama ne istediğim elde etmektir:

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

nasıl döngü olmadan Numpy bu uygulamaya?

cevap

9

saf numpy kullanarak VE döngü için kaçınarak:

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

Çıktı:

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

unutmayın, bunu yapar yerinde ikamesi. Bu sizin tarafınızdan arzu edilen şeydir, ancak gelecekteki izleyiciler tarafından istenmeyebilir. Bu yüzden not :)

+1

Harika. Hatta np.add.reduceat'a baktım ama ufunc metodlarıyla çok fazla zaman geçirmedim, bu yüzden çoğunu bilmiyorum. [Belgeler] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html) burada bile mükemmel ... "ufunc ek olarak, bu yöntem bir [ indeksler] + = b, sonuçların bir defadan fazla endeksli olan unsurlar için biriktirilmesi haricinde " – mgilson

+1

Teşekkürler" tam olarak istediğim şey budur. – maple

1

Her zaman kendini yineleyebilirsin. Bir şey gibi:

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

teşekkürler, ancak döngüden kaçınmak istiyorum. – maple

1

bu ... iyi ben elde edebilirsiniz yapmak akıllı bir numpy vektörleşen yol bilmiyorum:

Sen gibi bir şey (varsayarak yapabilirsiniz
>>> 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

Teşekkürler, ama döngüden kaçınmak istiyorum. – maple

+2

@maple - Bunu anlıyorum ama bunu yapmanın bir yolunu bilmiyorum. Tabii ki, bu demek değil ki, bunu yapmak için bir yol var. Her halükarda, bazen doğru (çalışma) bir koda sahip olmak, başkalarının daha iyi bir çatlama yapması için sorunu aydınlatmak için yeterlidir. – mgilson

+0

@maple Yapmanın bir yolunu merak ediyorsanız cevabımı kontrol edin. Teşekkürler. Sorunları farklı yollarla çözmek için örnek vermekle tamamen aynı fikirdeyim. – oxalorg

1

her dizin için bir korelasyon değeri) vardır:

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