Julia数组的多重选择
在Julia中,是否有一种方法可以从多维数组中检索包含多个元素的向量,类似于numpy的高级索引?例如,从该二维阵列: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]))
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]))
equalsgenconv[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的版本,因为它更清晰。仅供参考,我在这方面做了一些基准测试。