Почему разделение с использованием "двоеточия и запятой" отличается от использования набора индексов
Почему разделение с использованием "двоеточия и запятой" отличается от использования набора индексов?
Вот пример того, что я ожидал получить тот же результат, но это не так:
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, как массив индексов.