2016-03-29 3 views
5

Es gibt eine Liste der Eingänge X und eine Liste der Ausgänge Y. Jeder Eingang kann entweder 1 Erfolg oder 0 Fehler sein.Wie in Set in Subsets in Julia zu trennen?

X = [6 7 8] 
Y = [1 1 0] 

Was wäre die Julia Weg sein, um die Eingänge X in zwei Gruppen aufgeteilt - Erfolg und scheitert?

XSuccess = [6 7] 
XFails = [8] 

Ich kann es mit Schleifen zu tun, aber es scheint, dass es mindestens zwei bessere Möglichkeiten, es zu lösen - mit der finden Funktion und Listenkomprehensionen.

+0

Ich bin mir nicht sicher, ob Julia "Partition" -Funktion hat, aber Sie können immer "Filter" zweimal anwenden. – colinfang

+0

In der Frage, 'Jeder Eingang ...' sollte wahrscheinlich 'Jeder Ausgang ...' sein. Außerdem sollte 'X = [6 7 8]' wahrscheinlich 'X = [6,7,8]' sein, da ersteres eine 2D-Matrix und letzteres ein 1D-Vektor ist (was logischer aussieht). –

+0

Angesichts der Korrekturen im vorherigen Kommentar. 'XSuccess = X [Vektor {Bool} (Y)]' und 'XFails = X [! Vektor {Bool} (Y)]'. –

Antwort

2
XSuccess = getindex(X,find(Y)) 
XFail = getindex(X, find(x->x==0,Y)) 

prüfen the docs auf Array-Indizierung

2

Wie Sie weisen darauf hin, gibt es ein paar Möglichkeiten, wie Sie dies tun könnte. Sehen wir uns zuerst die Funktion find() an, und dann betrachten wir den Ansatz des Listenverständnisses.

x = [6, 7, 8] 
y = [1, 1, 0] 
xsucc = x[find(y .== 1)] 
xfail = x[find(y .== 0)] 

Für die Liste Verständnis Ansatz könnten wir etwas wie folgt tun.

x = [6, 7, 8] 
y = [1, 1, 0] 
xsucc = [w for w in x[y .== 1]] 
xfail = [w for w in x[y .== 0]] 

Davon bin ich nicht sicher, was die meisten idiomatische Julia Code betrachtet wird (vielleicht auch nicht).

+3

'find' kann vermieden und ersetzt werden mit nur' x [y. == 1] ', die bessere Leistung und weniger Speicheraufwand hat, je größer die Anzahl der Treffer in der Maske ist. –