2015-11-16 31 views
5

Julia'da, numpy'nin gelişmiş endekslemesine benzer çok boyutlu bir diziden birden çok öğe içeren bir vektör almanın bir yolu var mı?Julia dizisinden çok seçenek

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]] 

Bu bir vektör içinde, bir 3x3 dizideki sonuçlanır: Bu 2D diziden Örneğin screen shot

+0

Beğendin mi? '[genconv [[1,2,3], [2,3,1]] ...]' –

+0

Hayır, çünkü üç elementli bir vektör bekliyorum. –

cevap

5

col ve row dizine göre elementler tek yön almak için kullanmaktır sub2ind fonksiyonu:

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

DÜZENLEME

olarak zaten @ user3580870

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

Ben yakalanan görünen getindex ve dizi comprehensions sözdizimi arasındaki verimlilik açısından fark ne var

genconv[sub2ind(size(genconv),[1,2,3],[2,3,1])] eşittir görüş bildirdi.

+2

a.k.a. 'genconv [sub2ind (boyut (genconv), [1,2,3], [2,3,1])]' –

+0

Soğuk, işe yarıyor! Python/R'den gelen bu beklenmedik bir şekilde karmaşık görünüyor. İyi bir performansa ihtiyacım varsa bu iyi bir seçim mi? –

+3

Ne hakkında? [[I, j] için [[i, j] için zcon ([1,2,3], [2,3,1])] '? Bu biraz daha doğrudan görünüyor. – jverzani

2

Başka bir seçenek, sadece oldukça çok boyutlu bir dizi daha bir vektör olarak veri tedavi etmektir:

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

genconv[ [10, 13] ] 
4

Julia 0,5 şimdi CartesianIndex es dizileri ile endeksleme destekler.

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

oldukça ayrıntılı olduğunu ve:

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 

İlginç olan bu numpy tarzı noktasal indeksleme belirtmek için CartesianIndex es vektörler kullanabilirsiniz olmasıdır: A CartesianIndex birden boyutlarına uzanan özel endeks türüdür korkunç görünümlü, ancak bu çok güzel bir çözüm için yeni f.() özel yayınlama sözdizimi ile birleştirilebilir:

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