суммировать числовой массив по заданным индексам

#numpy #vectorization

#numpy #векторизация

Вопрос:

Я хочу добавить значения вектора:

 a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='d')
  

к значениям другого вектора:

 c = np.array([10, 10, 10], dtype='d')
  

в позиции, заданной другим массивом (того же размера a , со значениями 0 <= b[i] < len(c) )

 b = np.array([2, 0, 1, 0, 2, 0, 1, 1, 0, 2], dtype='int32')
  

Это очень просто записать в псевдокоде:

 for I in range(b.shape[0]):
    J = b[I]
    c[J]  = a[I]
  

Что-то вроде этого, но векторизованное (длина c в реальном случае составляет несколько сотен).

 c[0]  = np.sum(a[b==0]) # 27 (10   1   3   5   8)
c[1]  = np.sum(a[b==1]) # 25 (10   2   6   7)
c[2]  = np.sum(a[b==2]) # 23 (10   0   4   9)
  

Мое первоначальное предположение было:

 c[b]  = a
  

но суммируются только последние значения a .

Ответ №1:

Вы можете использовать np.bincount для получения взвешенных суммирований на основе идентификаторов, а затем добавлять с c помощью, например, так —

 np.bincount(b,a)   c