#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, касающуюся индексирования, и увидел это, но не понял, как я мог бы это использовать. Спасибо!