2015-11-16 2 views
5

В Julia существует ли способ получить вектор, содержащий несколько элементов из многомерного массива, аналогичный расширенному индексированию numpy? Например из этого 2D массива:Множественный выбор из массива Julia

genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) 
genconv[[1,2,3],[2,3,1]] 

Это приводит к матрице 3х3, а не в векторе: screen shot

+0

do not нравится? '[genconv [[1,2,3], [2,3,1]] ...]' –

+0

Нет, потому что я ожидаю вектор с тремя элементами. –

ответ

5

Чтобы получить элементы по col и row индекса один способ заключается в использовании sub2ind функции:

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1]))

EDIT

как уже @ user3580870 прокомментировал

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1])) равна genconv[sub2ind(size(genconv),[1,2,3],[2,3,1])]

, что я не получил показывает никакой разницы в эффективности между getindex и массива постижений синтаксиса.

+2

a.k.a. 'genconv [sub2ind (размер (genconv), [1,2,3], [2,3,1])]' –

+0

Прохладный, работает! Исходя из python/R, это выглядит неожиданно сложным. Является ли это хорошим выбором, если мне нужна хорошая производительность? –

+3

Как насчет '[genconv [i, j] для (i, j) в zip ([1,2,3], [2,3,1])]?? Это кажется немного более прямым. – jverzani

2

Другим вариантом является просто рассматривать данные в виде вектора, а не многомерный массив:

genconv = [6,9,7,1,4,2,3,2,0,9,10,8,7,8,5] 

genconv[ [10, 13] ] 
4

Юлия 0,5 теперь поддерживает индексацию массивов CartesianIndex эс. CartesianIndex представляет собой особый тип индекса, который охватывает несколько аспектов:

julia> genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) 
5×3 Array{Int64,2}: 
6 2 10 
9 3 8 
7 2 7 
1 0 8 
4 9 5 

julia> genconv[CartesianIndex(2,3)] # == genconv[2,3] 
8 

Что интересно, что вы можете использовать векторы CartesianIndex эс указать этот NumPy стиль точечно индексацию:

julia> genconv[[CartesianIndex(1,2),CartesianIndex(2,3),CartesianIndex(3,1)]] 
3-element Array{Int64,1}: 
2 
8 
7 

Это довольно многословным и ужасно выглядящий, но это можно комбинировать с новым специальным синтаксисом для вещаниядля очень хорошего решения:

julia> genconv[CartesianIndex.([1,2,3],[2,3,1])] 
3-element Array{Int64,1}: 
2 
8 
7 
Смежные вопросы