Подтвердить что ты не робот

Ненужный срез произвольных размеров

Я хотел бы нарезать массив numpy, чтобы получить i-й индекс в последнем измерении. Для трехмерного массива это будет:

slice = myarray[:,:,i]

Но я пишу функцию, где я могу взять массив произвольных измерений, поэтому для 4D-массива мне понадобится myarray[:,:,:,i] и так далее. Есть ли способ получить этот срез для любого массива без явного написания размеров массива?

4b9b3361

Ответ 1

Существует ... или Ellipsis, который выполняет именно это:

slice = myarray[...,i]

Эллипсис - это объект python, если вы хотите использовать его вне обозначения квадратной скобки.

Ответ 2

Собственно, только что нашел ответ. Как указано в документация numpy, это можно сделать с помощью объекта среза. В моем конкретном случае это сделало бы это:

idx = [slice(None)] * (myarray.ndim - 1) + [i] 
my_slice = myarray[idx]

slice(None) эквивалентно выбору всех элементов в этом индексе, а последний [i] выбирает конкретный индекс для последнего измерения.

Ответ 3

В терминах разреза произвольной размерности предыдущие превосходные ответы могут быть расширены:

indx = [Ellipsis]*myarray.ndim
indx[slice_dim] = i
slice = myarray[indx]

Это возвращает срез из любого измерения slice_dim - slice_dim = -1 воспроизводит предыдущие ответы. Для полноты - первые две строки вышеуказанного листинга можно свести к:

indx = [Ellipsis]*(slice_dim) + [i] + [Ellipsis]*(myarray.ndim-slice_dim-1)

хотя я считаю, что предыдущая версия более читаема.