Я не думаю, что для этого есть какой-то встроенный синтаксический сахар, но кусочки - это просто объекты, как и все остальное.Объект slice(None)
- это то, что создано из :
, в противном случае просто выбор индекса 0
работает нормально.
myarray[(slice(None),)*N+(0,)*(myarray.ndim-N)]
Обратите внимание на запятую в (slice(None),)
.По умолчанию Python не создает кортежи из скобок, если они не пусты.Запятая означает, что вы не хотите просто вычислять все, что находится внутри.
Ломтики хороши тем, что дают вам представление в объект вместо copy объекта.Вы можете использовать ту же идею, например, для перебора всего, кроме N-го измерения N-го измерения.В связи с этим возникло несколько вопросов о стековом потоке, и они почти единогласно прибегли к использованию индексов и других вещей, которые, как мне кажется, трудно рассуждать в многомерных пространствах.Кортежи фрагментов - ваш друг.
Из комментариев @PaulPanzer указывает на другую технику, которая мне скорее нравится.
myarray.T[(myarray.ndim-N)*(0,)].T
Во-первых, транспонирование в numpy - это операции просмотра вместо операций копирования.,Это не малоэффективно.Вот как это работает:
- Начните с
myarray
с размерами (0, ..., k) - Транспонирование
myarray.T
переупорядочивает их в (k, ..., 0) - Вся цель состоит в том, чтобы зафиксировать последние
myarray.ndim-N
размеры из исходного массива, поэтому мы выбираем те с [(myarray.ndim-N)*(0,)]
, который извлекает первые myarray.ndim-N
размеры из этого массива. - Они в неправильном порядке.У нас есть размеры (N-1, ..., 0).Используйте другую транспонирование с
.T
, чтобы получить порядок (0, ..., N-1).