Накапливайте тензоры по ячейкам с помощью Numpy

#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]])