Добавление скаляра в матрицу numpy на основе индексов в другом массиве numpy

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Извините, если этот вопрос сформулирован неправильно. Поэтому я бы предпочел объяснить на примере. У меня есть матрица numpy:

 a = np.array([[0.5, 0.8, 0.1], [0.6, 0.9, 0.3], [0.7, 0.4, 0.8], [0.8, 0.7, 0.6]])
 

И другой массив numpy, как показано:

 b = np.array([1, 0, 2, 2])
 

При заданном условии, что значения в b будут в range(a.shape[1]) и что b.shape[1] == a.shape[0] . Теперь это операция, которую мне нужно выполнить.

Для каждого индекса i a и соответствующего индекса i b мне нужно вычесть 1 из индекса j a[i] where j== b[i]

Итак, в моем примере, a[0] == [0.5 0.8 0.1] и b[0] == 1 . Поэтому мне нужно вычесть 1 из a[0][b[0]] , чтобы a[0] = [0.5, -0.2, 0.1] . Это должно быть сделано для всех строк a . Любое прямое решение без необходимости перебирать все строки или столбцы по одному?

Спасибо.

Ответ №1:

Используйте индексацию numpy. Смотрите Это сообщение для приятного введения:

 import numpy as np

a = np.array([[0.5, 0.8, 0.1], [0.6, 0.9, 0.3], [0.7, 0.4, 0.8], [0.8, 0.7, 0.6]])
b = np.array([1, 0, 2, 2])

a[np.arange(a.shape[0]), b] -= 1

print(a)
 

Вывод

 [[ 0.5 -0.2  0.1]
 [-0.4  0.9  0.3]
 [ 0.7  0.4 -0.2]
 [ 0.8  0.7 -0.4]]
 

В качестве альтернативы используйте substract.at:

 np.subtract.at(a, (np.arange(a.shape[0]), b), 1)
print(a)
 

Вывод

 [[ 0.5 -0.2  0.1]
 [-0.4  0.9  0.3]
 [ 0.7  0.4 -0.2]
 [ 0.8  0.7 -0.4]]
 

Основная идея заключается в том, что:

 np.arange(a.shape[0])  # shape[0] is equals to the numbers of rows
 

генерирует индексы строк:

 [0 1 2 3]