Есть несколько способов сделать это, но вот один из способов:
import numpy as np
data = np.arange(1, 7)
groups = np.array([0,0,1,2,2,1])
unique_groups = np.unique(groups)
sums = []
for group in unique_groups:
sums.append(data[groups == group].sum())
Вы можете векторизовать вещи, чтобы вообще не было цикла for, но я бы рекомендовал против этого. Он становится нечитаемым и потребует нескольких двумерных временных массивов, которые могут потребовать большого объема памяти, если у вас много данных.
Редактировать: вот один способ, которым вы могли бы полностью векторизовать. Имейте в виду, что это может (и, вероятно, будет) медленнее, чем версия выше. (И, возможно, есть лучший способ векторизовать это, но уже поздно, и я устала, так что это только первое, что приходит мне в голову ...)
Однако имейте в виду, что это плохой пример ... Вы действительно лучше (как с точки зрения скорости, так и читабельности) с циклом выше ...
import numpy as np
data = np.arange(1, 7)
groups = np.array([0,0,1,2,2,1])
unique_groups = np.unique(groups)
# Forgive the bad naming here...
# I can't think of more descriptive variable names at the moment...
x, y = np.meshgrid(groups, unique_groups)
data_stack = np.tile(data, (unique_groups.size, 1))
data_in_group = np.zeros_like(data_stack)
data_in_group[x==y] = data_stack[x==y]
sums = data_in_group.sum(axis=1)