Numpy Advanced Indexing: как происходит трансляция?
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
если мы запустим следующий оператор
x[1:, [2,0,1]]
получаем следующий результат
array([[ 6, 4, 5],
[10, 8, 9]])
Согласно документу numpy:
Расширенные индексы всегда транслируются и повторяются как один:
Я не могу понять, как здесь происходит спаривание индексов и трансляция.
2 ответа
Из Руководства пользователя NumPy, раздел 3.4.7 Объединение массивов индексов со срезами
срез преобразуется в массив индексов np.array, который транслируется вместе с массивом индексов для создания результирующего массива.
В нашем случае срез 1: преобразуется в массив индексов np.array([[1,2]]), который имеет форму (1,2). Это массив индексов строк. Следующий массив индексов (массив индексов столбцов) np.array([2,0,1]) имеет форму (3,2)
- форма массива индекса строки (1,2)
- форма массива индексов столбца (3,2)
индексные массивы имеют разную форму. Но они могут транслироваться в той же форме. Массив индекса строки транслируется в соответствии с формой массива индекса столбца.
Выбранный ответ неверен.
Здесь
[2,0,1]
действительно имеет форму и не будет расширяться во время трансляции.Пока
1:
означает, что вы сначала нарезаете массив перед трансляцией. Во время трансляции только подумайте о нарезке:
в качестве заполнителя для 0d-скаляра при каждом запуске. Итак, мы получаем:shape([2,0,1]) = (3,) shape([:]) = () -> (1,) -> (3,)
Так что это
[:]
концептуально расширенный в форме(3,)
, как это:x[[1,1,1], [2,0,1]] = [6 4 5] x[[2,2,2], [2,0,1]] = [10 8 9]
Наконец, нам нужно сложить результаты обратно
[[6 4 5] [10 8 9]]