2016-03-29 9 views
5

Istnieje lista wejść X i lista wyjść Y. Każde wejście może być niepowodzenie 1 lub 0.Jak rozdzielić zestaw na podzbiory w Julii?

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

Jaki byłby sposób Julia podzielić wejść X na dwa zestawy - sukces i się nie powiedzie?

XSuccess = [6 7] 
XFails = [8] 

mogę zrobić z pętli, ale wydaje się, że istnieją co najmniej dwie lepsze sposoby na jego rozwiązanie - przy znaleźć funkcyjnych i listowych.

+0

Nie jestem pewien, czy Julia ma funkcję 'partition', ale zawsze możesz dwukrotnie zastosować' filter'. – colinfang

+0

W pytaniu "Każde wejście ..." powinno prawdopodobnie być "Każde wyjście ...". Dodatkowo, 'X = [6 7 8]' powinno prawdopodobnie być 'X = [6,7,8]', jako że pierwsza jest macierzą 2D, a druga to wektor 1D (który wygląda bardziej logicznie). –

+0

Biorąc pod uwagę poprawki w poprzednim komentarzu. 'XSuccess = X [Wektor {Bool} (Y)]' i 'XFails = X [! Wektor {Bool} (Y)]'. –

Odpowiedz

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

Sprawdź the docs na tablicy indeksowania

2

Jak podkreślić, istnieje kilka sposobów można to zrobić. Najpierw przyjrzyjmy się funkcji funkcji find(), a następnie przyjrzymy się podejściu do rozumienia listy.

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

Dla podejścia do rozumienia listy możemy zrobić coś takiego.

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

Spośród nich nie jestem pewien, który jest uważany za najbardziej idiomatyczny kod Julii (być może nie).

+3

'find' można ominąć i zastąpić je' x [y. == 1] ', które ma lepszą wydajność i mniej narzutów pamięci, im większa ilość trafień w masce. –