Кусочек кусочка первых произвольных размеров - PullRequest
0 голосов
/ 21 сентября 2018

Существует замечательный вопрос / ответ по поводу нарезки последнего измерения: Numpy срез произвольных измерений : для нарезки numpy массива с целью получения i-го индекса в последнем измерении можно использовать ..или Ellipsis,

slice = myarray[...,i]

Что, если нужны первые N измерений?

Для 3D-массива N = 2:

slice = myarray[:,:,0]

Для 4-мерного массива N= 2:

slice = myarray[:,:,0,0]

Может ли это быть обобщено до произвольного измерения?

1 Ответ

0 голосов
/ 21 сентября 2018

Я не думаю, что для этого есть какой-то встроенный синтаксический сахар, но кусочки - это просто объекты, как и все остальное.Объект 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 - это операции просмотра вместо операций копирования.,Это не малоэффективно.Вот как это работает:

  1. Начните с myarray с размерами (0, ..., k)
  2. Транспонирование myarray.T переупорядочивает их в (k, ..., 0)
  3. Вся цель состоит в том, чтобы зафиксировать последние myarray.ndim-N размеры из исходного массива, поэтому мы выбираем те с [(myarray.ndim-N)*(0,)], который извлекает первые myarray.ndim-N размеры из этого массива.
  4. Они в неправильном порядке.У нас есть размеры (N-1, ..., 0).Используйте другую транспонирование с .T, чтобы получить порядок (0, ..., N-1).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...