Julia数组的多重选择

Julia数组的多重选择,julia,Julia,在Julia中,是否有一种方法可以从多维数组中检索包含多个元素的向量,类似于numpy的高级索引?例如,从该二维阵列: genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) genconv[[1,2,3],[2,3,1]] 这将生成3x3数组,而不是向量: 通过col和row索引获取元素的一种方法是使用sub2ind函数: getindex(genconv,sub2ind(大小(genconv),[1,2,3],[2,3,1]))

在Julia中,是否有一种方法可以从多维数组中检索包含多个元素的向量,类似于numpy的高级索引?例如,从该二维阵列:

genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3)
genconv[[1,2,3],[2,3,1]]
这将生成3x3数组,而不是向量:

通过
col
row
索引获取元素的一种方法是使用
sub2ind
函数:

getindex(genconv,sub2ind(大小(genconv),[1,2,3],[2,3,1]))

编辑

正如@user3580870已经评论过的那样

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1]))
equals
genconv[sub2ind(size(genconv),[1,2,3],[2,3,1])


我得到的结果表明
getindex
和数组理解语法在效率上没有差别

另一种选择是将数据视为向量,而不是多维数组:

genconv = [6,9,7,1,4,2,3,2,0,9,10,8,7,8,5]

genconv[ [10, 13] ]

Julia 0.5现在支持通过
CartesianIndex
es数组进行索引。笛卡尔指数是一种跨越多个维度的特殊索引类型:

julia> genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3)
5×3 Array{Int64,2}:
 6  2  10
 9  3   8
 7  2   7
 1  0   8
 4  9   5

julia> genconv[CartesianIndex(2,3)] # == genconv[2,3]
8
有趣的是,您可以使用
CartesianIndex
es的向量来指定此numpy样式的逐点索引:

julia> genconv[[CartesianIndex(1,2),CartesianIndex(2,3),CartesianIndex(3,1)]]
3-element Array{Int64,1}:
 2
 8
 7
这是非常冗长和可怕的外观,但这可以与新的
f.()
特殊广播语法相结合,以获得非常好的解决方案:

julia> genconv[CartesianIndex.([1,2,3],[2,3,1])]
3-element Array{Int64,1}:
 2
 8
 7

你不喜欢吗<代码>[genconv[[1,2,3],[2,3,1]…]不,因为我希望有一个包含三个元素的向量<代码>genconv[sub2ind(大小(genconv),[1,2,3],[2,3,1])]酷,行得通!来自python/R,这看起来出乎意料地复杂。如果我需要良好的性能,这是一个好的选择吗?zip([1,2,3],[2,3,1])中(I,j)的
[genconv[I,j]如何?这似乎更直接一些。你也可以用zip([1,2,3],[2,3,1])为i编写
[genconv[i..]for i
(使用splatting),但我更喜欢@jverzani的版本,因为它更清晰。仅供参考,我在这方面做了一些基准测试。