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