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

#python #arrays #numpy #performance

Вопрос:

У меня есть задача эффективно и красиво вычислить сумму. У меня есть два массива

 dst = [[1 2 3 4 5]
       [2 3 4 5 6]
       [1 1 2 2 3]
       [7 8 9 9 3]]
 

и

     ids = [[1 1 2 1 3]
           [2 2 1 1 3]
           [3 3 2 1 1]
           [2 2 1 3 3]
           [1 2 3 2 1]]
 

Для каждой строки в dst мне нужно вычислить сумму уникальных элементов в идентификаторах и вернуть максимальное значение суммы и количество индексов.

 Example for first row: I have 3 unique number in ids in first row [1,2,3].
indices for 1 = [0,1,3]  for 2 = [2] for 3 = [4] 

For 1: sum is sum of dst[0][0]   dst[0][1]   dst[0][3] = 1   2   4 = 7. 
For 2: sum is dst[0][2] = 3 
For 3: sum is dst[0][4] = 5. 
max(sum) = 7
number = 3

Total: [3,7] - for first row
 

Я понятия не имею, как это сделать с помощью функции Numpy эффективно и легко. Я сделал это с помощью классического python, но это решение работает слишком медленно.

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

2. в вашем примере ids это больше, чем dst . Если это не ошибка, то я не понял вашей проблемы.

Ответ №1:

Вы можете попробовать получить уникальные индексы следующим образом:

 indices = [np.unique(row) for row in ids]
 

а затем подсчитайте суммы:

 sums = [np.sum(dst[i][indices[i]]) for i in range(len(dst))] 
 

Комментарии:

1. Я забыл отметить: я не могу использовать циклы

2. Так вы имеете в виду, что понимание списка считается циклами?