2017-02-01 3 views
2

간단한 버전을 여러 값을 추가 을 나는이 작업을 수행 할 경우 :하나 NumPy와 배열 인덱스에

import numpy as np 
a = np.zeros(2) 
a[[1, 1]] += np.array([1, 1]) 

내가 출력으로 [0, 1]를 얻을. 하지만 [0, 2]을 원합니다. 어쨌든, 내 자신을 반복하는 대신 암시 적 numpy 루핑을 사용하여 가능합니까?

무엇-I-실제로-필요-할 일 버전

:

나는 인덱스, 값, 일부 부울 값을 포함하는 구조화 된 배열을 가지고있다. 부울을 기반으로 해당 인덱스에서 해당 값을 합산하려고합니다. 명확하게 간단한 루프를 사용하여 수행 할 수 있지만 영리한 numpy 인덱싱 (위와 같이)이 가능해야하는 것처럼 보입니다.

예를 들어, 내가 값, 인덱스 및 조건과 배열에서 채우려 5 개 요소 배열을 가지고 :

import numpy as np 
size = 5 
nvalues = 10 
np.random.seed(1) 
a = np.zeros(nvalues, dtype=[('val', float), ('ix', int), ('cond', bool)]) 
a = np.rec.array(a) 
a.val = np.random.rand(nvalues) 
a.cond = (np.random.rand(nvalues) > 0.3) 
a.ix = np.random.randint(size, size=nvalues) 

# obvious solution 
obvssum = np.zeros(size) 
for i in a: 
    if i.cond: 
     obvssum[i.ix] += i.val 

# is something this possible? 
doesntwork = np.zeros(size) 
doesntwork[a[a.cond].ix] += a[a.cond].val 

print(doesntwork) 
print(obvssum) 

는 출력 :

[ 0.   0.   0.61927097 0.02592623 0.29965467] 
[ 0.   0.   1.05459336 0.02592623 1.27063303] 

나는 무슨 일이 일어나고 있는지 생각 여기에 a[a.cond].ix이 유일 할 것이라는 보장이있는 경우 간단한 예제에서 설명한 것처럼 내 메서드가 제대로 작동합니다.

output = numpy.zeros(size) 
numpy.add.at(output, a[a.cond].ix, a[a.cond].val) 
:

답변

5

는 NumPy와의 ufuncs의 at 방법을위한 것입니다