Учитывая массив NumPy и массив сопоставления «многие к одному», каков самый быстрый способ вычисления агрегированных сопоставленных значений

#python #numpy

#python #numpy

Вопрос:

У меня есть два массива NumPy, один из которых содержит значения, другой отображает значения из первого в новый агрегированный массив, например, следующий

 a = np.array([10,10,10,10,10,10]) # values array
b = np.array([0,0,1,2,2,2]) # mapping to new index set
size = np.max(b)   1
result =np.zeros(size)
for i in range(size):
    result[i] = np.sum(a[b==i]) # values mapped to the same index are aggregated
print(result)

 

Что дает:
result = [20. 10. 30.]
Вышеуказанное работает, но оно не полностью векторизовано из-за цикла for, что делает его медленным. Из моих знаний линейной алгебры я знаю, что я могу преобразовать вектор b в матрицу преобразования, а затем использовать функцию dot для выполнения этого без цикла for, но это потребует гораздо большего количества базовых операций, чем требуется здесь, что делает этот подход также неоптимальным. Есть ли способ сделать это напрямую с помощью NumPy? 🙂 В принципе, объем требуемых операций должен быть просто суммированием.size…

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

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

2. Несколько вещей сбивают с толку: ваш a массив имеет только 1 значение (т.Е. 10, какой смысл?), И я бы ожидал, что выходной массив будет иметь размер b not max(b) 1 , то есть для каждого индекса в b мы берем соответствующее значение a .

3. Привет, да, я установил для всех значений значение 10, чтобы упростить численное отображение примера с суммой. На самом деле эти векторы довольно большие, а числа разные.

4. @Max массив b содержит индекс результирующего массива. Он представляет отображение и всегда будет иметь размер vector a , поскольку ему необходимо сопоставить каждый элемент vector a с новым индексом в result векторе.

Ответ №1:

Замените цикл на np.add.at(result, b, a) . Это выполнит агрегацию, которую вы хотите на месте. См ufunc.at . Общее описание at метода.