2017-01-04 4 views
1

나는 Numpy 배열이 3 개 있는데, a, bc입니다. bc은 매우 큰 배열이며 길이가 같습니다. b의 각 요소는 0, 1 또는 2이고, 또한 a의 길이는 3 지금 내가 루프에 대해 다음을 제거하는 방법이 있는지 궁금하다 : 어떤 의견이 크게 감사하겠습니다다른 배열에 의해 인덱싱 된 배열에 벡터화 된 방법 - Python/NumPy

for i in range(len(b)): 
    a[b[i]] += c[i] 

.

+0

for 루프를 없애고 여전히 'a'가 그렇게 수정 되었습니까? – Saksow

+0

예, 'for'를 제거하고 같은 결과를 얻었습니다. – ali

+0

반복해야합니다. 다른 방법은 없습니다. 2 회 반복을 병합 할 수 있으므로 한 번만 반복 할 수 있지만 회피 할 수는 없습니다. – Saksow

답변

2

당신과 같이, 같은 ID 기반의 합산에 대한 np.bincount을 사용할 수 있습니다 -

a += np.bincount(b,c,minlength=a.size) 

런타임 테스트를 -

In [136]: # Large arrays as inputs 
    ...: a = np.random.rand(3) 
    ...: c = np.random.rand(10000) 
    ...: b = np.random.randint(0,3,10000) 
    ...: 
    ...: # Make copies for testing 
    ...: a1 = a.copy() 
    ...: a2 = a.copy() 
    ...: 

In [137]: def bincount_app(a, b, c): # bincount approach as func 
    ...:  a += np.bincount(b,c,minlength=a.size) 
    ...:  

In [138]: %timeit np.add.at(a1, b, c) # @user2357112's soln 
1000 loops, best of 3: 1.29 ms per loop 

In [139]: %timeit bincount_app(a2, b, c) 
10000 loops, best of 3: 36.6 µs per loop 
+0

고맙습니다. 나는 너의 시간과 도움에 정말로 감사한다. – ali

3

NumPy와의 ufuncs이 같은 경우에 대한 at 방법이 있습니다

numpy.add.at(a, b, c) 

모든 사용자가 수행하는 작업입니다.배열의 b은 인덱스가 작동하지 않는 것을보기 전에 수행해야합니다.

+0

고맙습니다. 그것은 나에게 많은 도움이된다. – ali