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)

индексные массивы имеют разную форму. Но они могут транслироваться в той же форме. Массив индекса строки транслируется в соответствии с формой массива индекса столбца.

Выбранный ответ неверен.

  1. Здесь [2,0,1]действительно имеет форму и не будет расширяться во время трансляции.

  2. Пока 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]]
    
Другие вопросы по тегам