仅在不知道维总数的情况下,才如何按一维索引数组?

时间:2019-04-18 18:45:19

标签: julia

我有一个(可能是多维的)数组X。它至少具有k个维度。我不知道它有多少尺寸。如何仅按第k个维度对其进行索引?

例如如果X是4维的,k是3,并且所需的索引是7,我想得到X[:, :, 7, :]

2 个答案:

答案 0 :(得分:4)

使用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 :(得分:1)

除了Matt的出色回答外,让我补充一下,在这些情况下,通常一个轴具有特定的“含义”。在这种情况下,值得考虑像AxisArrays这样的软件包:

>>> denmark.total_bounds                                                      
array([ 8.08997684, 54.80001455, 12.69000614, 57.73001659])

>>> from shapely.geometry import box

>>> box(*denmark.total_bounds)                                 
<shapely.geometry.polygon.Polygon at 0x7f06be3e7668>

>>> print(box(*denmark.total_bounds))                                          
POLYGON ((12.6900061377556 54.80001455343792, 12.6900061377556 57.73001658795485, 8.089976840862221 57.73001658795485, 8.089976840862221 54.80001455343792, 12.6900061377556 54.80001455343792))

这使您无论数据如何存储都可以保证有意义的结果。例如,即使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) 是3d体积随时间变化(例如MRI扫描)而不是2d图片随时间变化,上述代码也会占用时间。