#python #arrays #numpy
Вопрос:
Учитывая набор массивов размерности B,N_1,...,N_k
и набор индексов ячеек размерности B
с M
ячейками (индексы ячеек варьируются от 0
до M-1
), цель состоит в том, чтобы накопить (суммировать) массивы по их соответствующему индексу ячеек, чтобы получить N_1,...,N_k,M
результат.
Другими словами, массив формы N_1,...,N_k
в позиции m
в результате представляет собой сумму всех N_1,...,N_k
массивов, для которых был указан соответствующий индекс ячейки m
.
Наивной реализацией было бы for
циклическое измерение пакета и накопление массивов один за другим, но мы ищем оптимизированную реализацию с Numpy
операторами.
Кто-нибудь готов принять этот вызов?
Комментарии:
1. Пожалуйста, приложите усилия, чтобы добавить некоторые данные, ввод, вывод…
2. Вы, кажется, предполагаете, что я не добавлял данные по лености, в то время как это было скорее для того, чтобы вопрос был кратким.
Ответ №1:
Пользователь np.reduceat с правильными индексами:
# sample data
tensor = np.arange(5*3).reshape(5,3)
bins = np.array([0,1,0,1,0])
# order the bins
orders = np.argsort(bins)
# calculate the start and end for each bin
a = [0]
for i, curr in enumerate(orders[1:], 1):
if bins[orders[i-1]] != bins[curr]:
a.append(i)
a.append(i-1)
a.append(len(bins)-1)
# output
np.add.reduceat(tensor[orders], a)[::2]
Выход:
array([[18, 21, 24],
[15, 17, 19]])