Ответ 1
Существует ...
или Ellipsis
, который выполняет именно это:
slice = myarray[...,i]
Эллипсис - это объект python, если вы хотите использовать его вне обозначения квадратной скобки.
Я хотел бы нарезать массив numpy, чтобы получить i-й индекс в последнем измерении. Для трехмерного массива это будет:
slice = myarray[:,:,i]
Но я пишу функцию, где я могу взять массив произвольных измерений, поэтому для 4D-массива мне понадобится myarray[:,:,:,i]
и так далее. Есть ли способ получить этот срез для любого массива без явного написания размеров массива?
Существует ...
или Ellipsis
, который выполняет именно это:
slice = myarray[...,i]
Эллипсис - это объект python, если вы хотите использовать его вне обозначения квадратной скобки.
Собственно, только что нашел ответ. Как указано в документация numpy, это можно сделать с помощью объекта среза. В моем конкретном случае это сделало бы это:
idx = [slice(None)] * (myarray.ndim - 1) + [i]
my_slice = myarray[idx]
slice(None)
эквивалентно выбору всех элементов в этом индексе, а последний [i] выбирает конкретный индекс для последнего измерения.
В терминах разреза произвольной размерности предыдущие превосходные ответы могут быть расширены:
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)
хотя я считаю, что предыдущая версия более читаема.