Как индексировать массив по одному измерению, только если я не знаю общее количество измерений? - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть (возможно многомерный) массив X. Он имеет как минимум k размеры. Я не знаю, сколько у него измерений. Как мне индексировать его только по k -м измерению?

например. если X 4-мерный, k равен 3, а желаемый индекс равен 7, я хочу получить X[:, :, 7, :].

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Использование selectdim:

julia> X = reshape(1:2*3*5*7, 5, 3, 7, 2);

julia> selectdim(X, 3, 7)
5×3×2 view(reshape(::UnitRange{Int64}, 5, 3, 7, 2), :, :, 7, :) with eltype Int64:
[:, :, 1] =
 91   96  101
 92   97  102
 93   98  103
 94   99  104
 95  100  105

[:, :, 2] =
 196  201  206
 197  202  207
 198  203  208
 199  204  209
 200  205  210

julia> selectdim(X, 3, 7) == X[:, :, 7, :]
true
1 голос
/ 19 апреля 2019

В дополнение к превосходному ответу Мэтта, позвольте мне добавить, что в этих случаях часто бывает, что одна ось имеет особое «значение».В таких случаях стоит рассмотреть пакет типа AxisArrays :

julia> using AxisArrays

julia> movie = AxisArray(rand(720, 1280, 50), :vertical, :horizontal, :time);

julia> timeslice = movie[Axis{:time}(5)];    # index along the time dimension

julia> size(timeslice)
(720, 1280)

Это позволяет вам гарантировать значимый результат независимо от того, как хранятся ваши данные.Например, приведенный выше код занял бы временной интервал, даже если movie был бы трехмерным объемом в зависимости от времени (например, МРТ-сканирование), а не двумерным изображением в зависимости от времени.

...