Julia - 如何索引向量 w/ 索引向量的向量?

Julia - How to index vector w/ vector of vector of indices?

假设 idxs 是定义为

的向量向量
3-element Vector{Vector{Int64}}:
 [1, 2]
 [1, 3]
 [1, 4]

并假设 A 是定义为

的向量
5-element Vector{Int64}:
 6
 7
 8
 9
 10

使用 Python 和 numpy,我可以简单地(用伪代码)A[idxs],这将 return 一个包含元素

的二维数组
[
  [6 7]
  [6 8]
  [6 9]
]

我如何在 Julia 中执行相同的索引,我在其中多次索引到一维向量,并检索条目矩阵?

谢谢

您可以将数组理解与 hcat 结合使用。您可以使用生成的 2x3 矩阵或转置结果。

julia> hcat([A[i] for i in id]...)'
3×2 adjoint(::Matrix{Int64}) with eltype Int64:
 6  7
 6  8
 6  9

数据

julia> show(id)
[[1, 2], [1, 3], [1, 4]]

julia> show(A)
[6, 7, 8, 9, 10]

最简单的解决方案是使用列表理解

julia> [A[i] for i in idxs]
3-element Vector{Vector{Int64}}:
 [6, 7]
 [6, 8]
 [6, 9]

除了现有的很好的答案之外,我会注意到,如果您可以将起始索引重新排列为适当的二维数组,而不是向量的向量(沿着以下几行或通过将它们填充到二维数组中开始)

julia> idxs = vcat(transpose.(idxs)...)
3×2 Matrix{Int64}:
 1  2
 1  3
 1  4

那么你可以通过简单地直接用idxs的二维数组索引A来做到这一点:

julia> idxs
3×2 Matrix{Int64}:
 1  2
 1  3
 1  4

julia> A[idxs]
3×2 Matrix{Int64}:
 6  7
 6  8
 6  9

你也可以使用A[i]背后的底层函数,即getindex(A,i)。你可以广播那个函数并获得你想要的:

A = collect(6:10),idxs = [[1, 2], [1, 3], [1, 4]];
res = getindex.(Ref(A),idxs)

Ref(A)是在广播期间制作一个“常量”元素(广播为具有形状的集合的每个元素应用函数,但 A 和 idxs 不具有相同的形状。Ref(A) 修复通过表现得像一个标量)