Индексирование матовой матрицы - PullRequest
0 голосов
/ 25 сентября 2018

Допустим, у меня есть массив (4,10), инициализированный нулями, и у меня есть входной массив в форме [2,7,0,3].Входной массив изменит матрицу нулей так, чтобы она выглядела следующим образом:

[[0,0,1,0,0,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,0,0],
 [1,0,0,0,0,0,0,0,0,0],
 [0,0,0,1,0,0,0,0,0,0]]

Я знаю, что могу сделать это, перебирая цель ввода и индексируя матричный массив с чем-то вроде matrix[i][target in input target], но я попыталсясделать это без цикла, выполнив что-то вроде: matrix[:, input_target] = 1, но это устанавливает мне всю матрицу для всех 1. Видимо, способ сделать это: matrix[range(input_target.shape[0]), input_target], вопрос в том, почему это работает и не использует двоеточие?

Спасибо!

1 Ответ

0 голосов
/ 25 сентября 2018

Вы хотите обновить только один столбец для каждой строки.Следовательно, при расширенном индексировании вы должны явно указать эти идентификаторы строк:

A = np.zeros((4, 10))
A[np.arange(A.shape[0]), [2, 7, 0, 3]] = 1

Результат:

array([[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.]])

Использование двоеточия для индексатора строк скажет NumPy:обновить все строк для указанных столбцов:

A[:, [2, 7, 0, 3]] = 1

array([[ 1.,  0.,  1.,  1.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  1.,  1.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  1.,  1.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  1.,  1.,  0.,  0.,  0.,  1.,  0.,  0.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...