2017-10-20 5 views
2

Ich habe einen 2D-Array konstruieren wie:einen Index der Auswahl für jede Spalte gegeben, einen 1D-Array aus einem 2D-Array

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 

Ich mag aus jeder Spalte einen Wert auswählen und einen 1D-Array zu konstruieren.

So zum Beispiel, wenn meine Entscheidungen sind

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

Dann ist die gewünschte Ausgabe [1, 7, 13, 9, 5]. Was ist der beste Weg, das zu tun? In meiner speziellen Anwendung erzeuge ich diese Werte zufällig, z.

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

Vielen Dank!

Antwort

3

Dies ist wahrscheinlich der einfachste Ansatz: [m[c, i] for (i, c) in enumerate(choices)]

EDIT: Wenn beste Mittel schnellste für Sie eine solche Funktion schneller ca. 2x sein sollte als das Verständnis für große 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 
Verwandte Themen