#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