从Julia数组中进行多项选择

时间:2015-11-16 11:31:00

标签: julia

在Julia,有没有办法从多维数组中检索包含多个元素的向量,类似于numpy的高级索引?例如,来自这个2D数组:

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数组,而不是向量: screen shot

3 个答案:

答案 0 :(得分:5)

要按colrow索引获取元素,一种方法是使用sub2ind函数:

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

修改

已经@ user3580870评论了

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

我得到的结果显示getindex数组理解语法之间的效率没有差异。

答案 1 :(得分:4)

Julia 0.5现在支持CartesianIndex es数组的索引。 CartesianIndex是一种跨越多个维度的特殊索引类型:

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

答案 2 :(得分:2)

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

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

genconv[ [10, 13] ]