2015-11-16 17 views
5

In Julia, esiste un modo per recuperare un vettore contenente più elementi da una matrice multidimensionale simile all'indicizzazione avanzata di numpy? Per esempio da questa matrice 2D:Selezione multipla da matrice 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]] 

Ciò si traduce in una matrice 3x3, non in un vettore: screen shot

+0

no mi piace? '[genconv [[1,2,3], [2,3,1]] ...]' –

+0

No, perché mi aspetto un vettore con tre elementi. –

risposta

5

Per ottenere elementi di col e row indice un modo è quello di utilizzare sub2ind funzione:

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

EDIT

come già @ user3580870 ha commentato

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

quello che ho ottenuto spettacoli alcuna differenza in termini di efficienza tra il getindex e comprensioni matrice sintassi.

+2

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

+0

Cool, funziona! Venendo da python/R questo sembra inaspettatamente complicato. Questa è una buona scelta se ho bisogno di buone prestazioni? –

+3

E riguardo '[genconv [i, j] per (i, j) in zip ([1,2,3], [2,3,1])]'? Questo sembra un po 'più diretto. – jverzani

2

Un'altra opzione è quella di trattare solo i dati come un vettore, piuttosto che un array multidimensionale:

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

genconv[ [10, 13] ] 
4

Julia 0.5 ora supporta l'indicizzazione da matrici di CartesianIndex es. Un CartesianIndex è un particolare tipo di indice che si estende su più dimensioni:

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 

La cosa interessante è che è possibile utilizzare vettori di CartesianIndex es specificare questo NumPy stile puntuale indicizzazione:

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

che è piuttosto prolisso e terribile, ma questo può essere combinato con la nuova sintassi di trasmissione speciale f.() per una soluzione molto bella:

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