我有一个(可能是多维的)数组X
。它至少具有k
个维度。我不知道它有多少尺寸。如何仅按第k
个维度对其进行索引?
例如如果X
是4维的,k
是3,并且所需的索引是7,我想得到X[:, :, 7, :]
。
答案 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图片随时间变化,上述代码也会占用时间。