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)
修复通过表现得像一个标量)
假设 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)
修复通过表现得像一个标量)