У меня есть очень длинный массив * длины L
(назовем его values
), который я хочу суммировать, и отсортированный 1D-массив той же длины L
, содержащий N
целые числа, с которыми чтобы разбить исходный массив - назовем этот массив labels
.
То, что я сейчас делаю, это (module
является cupy
или numpy
):
result = module.empty(N)
for i in range(N):
result[i] = values[labels == i].sum()
Но это не может быть наиболее эффективным способом сделать это (должно быть возможно избавиться от for
l oop, но как?). Поскольку labels
отсортировано, я мог легко определить точки останова и использовать эти индексы в качестве точек начала / остановки, но я не понимаю, как это решает проблему for
l oop.
Примечание что я бы хотел избежать создания массива размером N
x L
по пути, если это возможно, поскольку L
очень большой.
Я работаю в cupy, но с любым numpy решение тоже приветствуется и, вероятно, может быть перенесено. В случае с Cupy, похоже, это будет случай ReductionKernel
, но я не совсем понимаю, как это сделать.
* в моем случае, values
- 1D, но я предполагаю, что решение не будет зависеть от этого