Julia - 如何使用索引向量来索引向量的向量?

4
假设 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],这将返回一个包含元素的二维数组。
[
  [6 7]
  [6 8]
  [6 9]
]

我该如何在Julia中执行相同的索引操作?我需要多次对一维向量进行索引,并检索出一个条目矩阵。

谢谢


你想要一个二维数组还是一个一维向量作为结果? - Andre Wildberg
2D数组(矩阵,而不是向量的向量)。有趣的是,当使用@DecowVR的答案时,我遇到了一些奇怪的结果,其中沿输出行求和的结果与预期不符。 - A is for Ambition
4个回答

4
你可以使用数组推导式与 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]

3
最简单的解决方案是使用列表推导式。
julia> [A[i] for i in idxs]
3-element Vector{Vector{Int64}}:
 [6, 7]
 [6, 8]
 [6, 9]

1

除了现有的答案之外,我要指出的是,如果您可以重新排列起始索引以成为一个适当的二维数组,而不是一个向量的向量(可以按以下方式进行或将其填充到一个二维数组中开始)。

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

0

你也可以使用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) 通过像标量一样运行来解决这个问题)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接