Доступ к элементам массива на основе индексов, заданных другим массивом - PullRequest
0 голосов
/ 23 марта 2019

Предположим, у меня есть следующее 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] из A, вторая строка B представляет элемент [1,3] из A и так далее. Я хочу получить доступ к элементам A на основе координат, заданных каждой строкой B. Например, в R команда A[B] дает именно то, что я хочу: 0.00624508 0.458094 0.269487 0.534655 0.748525 0.469938, но в Юлии эта же команда дает

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

и это не то, что я хочу. Есть ли подобный способ кодирования A[B] в Юлии, чтобы я мог получить то, что получил в R? Должен применяться к любому массиву.

1 Ответ

2 голосов
/ 23 марта 2019

Создайте массив из 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 как такой массив, но это, конечно, не всегда возможно.

...