Это выражение означает: нарезать массив softmax_output
формы (N, C)
, извлекая из него только значения, относящиеся к обучающим меткам y
.
Двумерные numpy.array
можно разрезать с помощью двух списков, содержащихсоответствующие значения (т. е. они не должны вызывать ошибку индекса)
range(num_train)
создает индекс для первой оси, который позволяет выбирать конкретные значения в каждой строке со вторым индексом - list(y)
.Вы можете найти его в документации numpy для индексирования .
Первый индекс range_num имеет длину, равную первому измерению softmax_output
(= N
).Он указывает на каждую строку матрицы;затем для каждой строки он выбирает целевое значение через соответствующее значение из второй части индекса - list(y)
.
Пример:
softmax_output = np.array( # dummy values, not softmax
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]]
)
num_train = 4 # length of the array
y = [2, 1, 0, 2] # a labels; values for indexing along the second axis
softmax_output[range(num_train), list(y)]
Out:
[3, 5, 0, 12]
Итак, он выбирает третий элемент из первой строки,второй из второго ряда и т. д. Вот как это работает.
(п.с. Я вас неправильно понимаю, а вы интересуетесь «почему», а не «как»?)