Доступ к элементам массива на основе индексов, заданных другим массивом

#arrays #indexing #julia

#массивы #индексирование #julia

Вопрос:

Предположим, у меня есть следующее 4x4 Array в Julia:

 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 та же команда дает

 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] в Julia, чтобы я получал то, что я получаю в R ? Должно быть применимо к любому массиву.

Ответ №1:

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

Комментарии:

1. О, я понимаю! Секрет заключался в CartesianIndex ! Я читал веб-страницу Julia, касающуюся индексирования, и увидел это, но не понял, как я мог бы это использовать. Спасибо!