2016-03-29 10 views
5

Ci sono gli elenchi degli ingressi X e l'elenco delle uscite Y. Ogni input può essere o 1 successo o 0 fallire.Come separare il set in sottoinsiemi in Julia?

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

Quale sarebbe il modo Julia per dividere gli ingressi X in due gruppi - il successo e non riesce?

XSuccess = [6 7] 
XFails = [8] 

posso farlo con i loop, ma sembra che ci sono almeno due modi migliori per risolverlo - Con il trovare funzione e list comprehension.

+0

Non sono sicuro che Julia abbia la funzione 'partition', ma puoi sempre applicare' filter' due volte. – colinfang

+0

Nella domanda, "Ogni input ..." dovrebbe probabilmente essere "Ogni uscita ...". Inoltre, 'X = [6 7 8]' dovrebbe essere probabilmente 'X = [6,7,8]', poiché il primo è una matrice 2D e il secondo è un vettore 1D (che sembra più logico). –

+0

Considerate le correzioni nel commento precedente. 'XSuccess = X [Vector {Bool} (Y)]' e 'XFails = X [! Vector {Bool} (Y)]'. –

risposta

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

Controllare the docs su array di indicizzazione

2

Come fai notare, ci sono alcuni modi si potrebbe fare questo. Diamo un'occhiata prima all'approccio della funzione find(), quindi esamineremo l'approccio di comprensione della lista.

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

Per l'approccio di comprensione della lista si potrebbe fare qualcosa di simile al seguente.

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

Di questi, non sono sicuro che sia considerato il codice Julia più idiomatico (forse nessuno dei due).

+3

'find' può essere evitato e sostituito con solo' x [y. == 1] ', che ha prestazioni migliori e meno memoria in testa, maggiore è la quantità di colpi nella maschera. –