2017-10-20 6 views
2

J'ai un tableau 2D tels que:Étant donné un indice de choix pour chaque colonne, la construction d'un tableau 1D à partir d'un tableau 2D

julia> m = [1 2 3 4 5 
      6 7 8 9 10 
      11 12 13 14 15] 
3×5 Array{Int64,2}: 
    1 2 3 4 5 
    6 7 8 9 10 
11 12 13 14 15 

Je veux choisir une valeur de chaque colonne et construire un tableau 1D.

Ainsi par exemple, si mes choix sont

julia> choices = [1, 2, 3, 2, 1] 
5-element Array{Int64,1}: 
1 
2 
3 
2 
1 

Ensuite, la sortie désirée est [1, 7, 13, 9, 5]. Quelle est la meilleure façon de faire cela? Dans mon application particulière, je génère aléatoirement ces valeurs, par ex.

choices = rand(1:size(m)[1], size(m)[2]) 

Merci!

Répondre

3

Ceci est probablement l'approche la plus simple: [m[c, i] for (i, c) in enumerate(choices)]

EDIT: Si meilleur moyen le plus rapide pour vous une telle fonction devrait être d'environ 2 fois plus rapide que la compréhension pour les grands m:

function selector(m, choices) 
    v = similar(m, size(m, 2)) 
    for i in eachindex(choices) 
     @inbounds v[i] = m[choices[i], i] 
    end 
    v 
end