Почему разделение с использованием "двоеточия и запятой" отличается от использования набора индексов

Почему разделение с использованием "двоеточия и запятой" отличается от использования набора индексов?

Вот пример того, что я ожидал получить тот же результат, но это не так:

import numpy as np

a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

print(a[[0,1],[0,1]])
# Output
# [[ 1  2  3]
#  [10 11 12]]

print(a[:,[0,1]])
# Output
# [[[ 1  2  3]
#   [ 4  5  6]]
#  [[ 7  8  9]
#   [10 11 12]]]

Почему они не эквивалентны?

1 ответ

В первом случае вы индексируете массив a с 2 списками одинаковой длины, что было бы эквивалентно индексации с 2 массивами одинаковой формы (см. документацию по массивам в качестве индексов).

Поэтому на выходе a[0,0] (что так же, как a[0,0,:]) а также a[1,1]поэлементные комбинации массива индекса. Ожидается, что это вернет массив формы 2,3. 2 потому что это длина индексного массива, и 3 потому что это ось, которая не индексируется.

Во втором случае, однако, результат a[:,0] (эквивалентно a[:,0,:]) а также a[:,1], Таким образом, здесь ожидаемый результат представляет собой массив с первым и третьим измерениями, эквивалентными исходному массиву, а второе измерение, равное 2, длиной индексного массива (который здесь совпадает с исходным размером второй оси),

Чтобы ясно показать, что эти две операции явно не совпадают, мы можем попытаться предположить эквивалентность между : и диапазон такой же длины, что и от оси до третьей оси, что приведет к:

print(a[[0,1],[0,1],[0,1,2]])
IndexError                                Traceback (most recent call last)
<ipython-input-8-110de8f5f6d8> in <module>()
----> 1 print(a[[0,1],[0,1],[0,1,2]])

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (2,) (3,) 

Это связано с тем, что элементная комбинация индексных массивов невозможна. Напротив этого, a[:,:,:] вернул бы весь массив, и a[[0,1],[0,1],[0,2]] возвращается [ 1 12] который, как и ожидалось, является массивом одного измерения длиной 2, как массив индексов.

Другие вопросы по тегам