2013-08-16 23 views
6

'da aynı dizi dizileri atama Python'da bir dizinin tekrarlayan indekslerini atamak için hızlı bir yol (döngü olmadan) bulmak istiyorum. Bu kullanılarak arzu edilen sonuçtur döngü için: I endekslerine a için x eklemek deneyinPython/Numpy

import numpy as np 
a=np.arange(9, dtype=np.float64).reshape((3,3)) 
# The array indices: [2,3,4] are identical. 
Px = np.uint64(np.array([0,1,1,1,2])) 
Py = np.uint64(np.array([0,0,0,0,0])) 
# The array to be added at the array indices (may also contain random numbers). 
x = np.array([.1,.1,.1,.1,.1]) 

for m in np.arange(len(x)): 
    a[Px[m]][Py[m]] += x 

print a 
%[[ 0.1 1. 2.] 
%[ 3.3 4. 5.] 
%[ 6.1 7. 8.]] 

Px,Py Açıkçası aynı sonucu elde yok (3.3 ve 3.1):

a[Px,Py] += x 
print a 
%[[ 0.1 1. 2.] 
%[ 3.1 4. 5.] 
%[ 6.1 7. 8.]] 

Bunu numpy ile yapmanın bir yolu var mı? Teşekkürler.

+0

Birincisi, grup olur değerleri birlikte, sen küpe (Px, Py) bir listesi var ki. Bu listeyi sıralayın, olayları sayın, bu sayıyla x'i çarpın ve diziye ekleyin. Ama bir şekilde uyuşmuş çift entrikayı atlıyor gibi görünüyor .... garip. – Dschoni

cevap

7

Evet, bu yapılabilir, ama bu biraz zordur edilebilir: Her şeyden

# convert yourmulti-dim indices to flat indices 
flat_idx = np.ravel_multi_index((Px, Py), dims=a.shape) 
# extract the unique indices and their position 
unique_idx, idx_idx = np.unique(flat_idx, return_inverse=True) 
# Aggregate the repeated indices 
deltas = np.bincount(idx_idx, weights=x) 
# Sum them to your array 
a.flat[unique_idx] += deltas 
+0

Bah, bana aynı cevap ile beni 4 saniye yendi. Her ne kadar içtenlikle bunu yapmanın daha iyi bir yolu olduğunu umuyordum. – Daniel

+0

Teşekkürler! Düz endeksleri almak için np.ravel_multi_index işlevini kullandığınızı ve ardından isteğe bağlı ağırlıklar parametresiyle np.bincount değerini kullandığımı seviyorum. – Paul