根据另一个数组给定的索引访问数组的元素

时间:2019-03-23 17:20:25

标签: arrays indexing julia

假设我在Julia中有以下4x4 Array

julia> A=rand(4,4)
4×4 Array{Float64,2}:
 0.00624508  0.624399  0.458094  0.341848
 0.303817    0.269487  0.580949  0.534655
 0.748525    0.419411  0.469938  0.659914
 0.730659    0.191461  0.996144  0.74772

我还有另一个6x2 Array,其中每一行代表一个行-列对:

julia> B=[ 1 1; 1 3; 2 2; 2 4; 3 1; 3 3]
6×2 Array{Int64,2}:
 1  1
 1  3
 2  2
 2  4
 3  1
 3  3

B的第一行代表[1,1]的元素AB的第二行代表[1,3]的元素A , 等等。我想基于A每行给出的坐标来访问B的元素。例如,在R中,命令A[B]给出了我想要的:0.00624508 0.458094 0.269487 0.534655 0.748525 0.469938,但是在Julia中,相同的命令给出了

julia> A[B]
6×2 Array{Float64,2}:
 0.00624508  0.00624508
 0.00624508  0.748525
 0.303817    0.303817
 0.303817    0.730659
 0.748525    0.00624508
 0.748525    0.748525

这不是我想要的。在Julia中是否有类似的编码A[B]的方式,以便获得R中获得的信息?必须适用于任何数组。

1 个答案:

答案 0 :(得分:2)

从索引对中构造CartesianIndex数组:

julia> A[CartesianIndex.(B[:, 1], B[:, 2])]
6-element Array{Float64,1}:
 0.987200021334854    
 0.5261639427155012   
 0.8430528192705655   
 0.5300778835366697   
 0.5044387593056074   
 0.0025132074927423087

正如您所观察到的那样,有必要将这种“点索引”与“形状索引”区分开来(我做了这些术语)。

理想情况下,您已经将B构造成这样的数组,但是,这并不总是可行的。