2015-11-16 10 views
5

Gibt es in Julia eine Möglichkeit, einen Vektor mit mehreren Elementen aus einem mehrdimensionalen Array ähnlich der erweiterten Indizierung von numpy zu erhalten? Zum Beispiel aus diesem 2D-Array:Mehrfachauswahl aus dem Julia-Array

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

Dies resultiert in einem 3x3-Array, nicht in einem Vektor: screen shot

+0

nicht mag ich? '[genconv [[1,2,3], [2,3,1]] ...]' –

+0

Nein, weil ich einen Vektor mit drei Elementen erwarte. –

Antwort

5

Elemente von col und row Index eines Weg zu bekommen, ist sub2ind Funktion zu verwenden:

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

EDIT

wie bereits @ user3580870 hat

kommentiert

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

was ich zeigt keinen Unterschied in der Effizienz zwischen getindex und Array Comprehensions Syntax bekam.

+2

a.k.a.' genconv [sub2ind (Größe (genconv), [1,2,3], [2,3,1])] ' –

+0

Cool, funktioniert! Von python/R kommend sieht das unerwartet kompliziert aus. Ist das eine gute Wahl, wenn ich eine gute Leistung brauche? –

+3

Was ist mit '[genconv [i, j] für (i, j) in zip ([1,2,3], [2,3,1])]'? Dies scheint ein bisschen direkter. – jverzani

2

Eine weitere Möglichkeit besteht darin, nur die Daten als Vektor zu behandeln, sondern als ein mehrdimensionales Array:

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

genconv[ [10, 13] ] 
4

Julia 0.5 jetzt Indizierung von Arrays von CartesianIndex ihm unterstützt. Ein CartesianIndex ist ein spezieller Indextyp, die mehrere Dimensionen umfasst:

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 

Was interessant ist, dass man Vektoren CartesianIndex es verwenden können, um dieses numpy Stil punktuellen Indexierung angeben:

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

Das ist ziemlich ausführlich und Schrecklich aussehende, aber das kann mit der neuen f.() spezielle Broadcasting-Syntax für eine sehr schöne Lösung kombiniert werden:

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