Поскольку ваше индексирующее выражение имеет как :
, так и список в нем, NumPy должен применять как базовые, так и расширенные правила индексирования, а также то, как они взаимодействуют, что-то странное. Соответствующая документация - here, и вы должны проконсультироваться с ней, если хотите узнать полную информацию. Я сосредоточусь на той части, которая вызывает несоответствие этой формы.
Когда все компоненты индексирующего выражения, которые используют расширенную индексацию, находятся рядом друг с другом, размеры результата, поступающего из расширенной индексации, помещаются в результат в положение заменяемых размеров. Расширенные компоненты индексирования - подобные массиву, такие как массивы, списки и скаляры; скаляры также могут использоваться в базовой индексации, но для этой цели они считаются передовыми. Таким образом, если arr.shape == (10, 20, 30)
и ind.shape = (2, 3, 4)
, то
arr[:, ind, :].shape == (10, 2, 3, 4, 30)
Ваше первое выражение попадает в этом случае.
С другой стороны, если компоненты выражения индексации, которые используют передовые индексации отделены друг от друга компонентов, которые используют основной индексации, не существует однозначного место, чтобы вставить дополнительные размеры индексации. Например, с
arr[ind, :, ind]
результат должен иметь размерность длины 2, 3, 4 и 20, и нет хорошее место, чтобы приклеить 20.
Когда передовые компоненты индексации отделены друг от друга основным индексирование компонентов, NumPy сохраняет все размеры, возникающие в результате расширенной индексации в начале массива результатов. Основными компонентами индексации являются :
, ...
и np.newaxis
(None
). Второе выражение относится к этому случаю.
Поскольку ваше второе выражение имеет расширенные компоненты индексирования разделенных основных компонентов индексирования и ваше первое выражение не ваши два выражения используют различные правила индексации. Чтобы этого избежать, вы можете разделить базовую индексацию и расширенную индексацию на два этапа или заменить базовую индексацию эквивалентной расширенной индексацией. Независимо от того, что вы делаете, я рекомендую поставить пояснительный комментарий выше такого кода.
Это одна из причин не использовать синтаксис 'arr [x] [y]'; логика, которая делает ее эквивалентной «arr [x, y]» для случая, когда x и y являются скалярами (а arr не является матрицей) не обобщает прошлое скалярного случая. – user2357112
Кроме того, объединение базовой индексации (с ':') и расширенной индексацией (со списком) является странным и сложным. Соответствующий раздел документации [здесь] (http://docs.scipy.org/doc/numpy-1.10.0/reference/arrays.indexing.html#combining-advanced-and-basic-indexing). – user2357112