2016-02-09 17 views
5
training_images = np.array([i for i in images if i not in validation_images]) 

Quanto sopra è errato (come indicato in un commento di seguito). Qual è un modo corretto e più veloce per farlo?Numpy array esclude alcuni elementi

miei validation_images è solo

validation_images = images[::6] 

e la forma delle immagini è (60000, 784). Questa è una matrice numpy.

Il metodo corrente non è accettabile perché troppo lento.

+0

Nota: ['in' per gli array non ha senso] (http://stackoverflow.com/questions/18320624/how-does-contains-work-for-ndarrays), quindi il codice corrente probabilmente non sta facendo quello che vuoi comunque. Inoltre, come dovrebbe essere influenzato dai duplicati? Vuoi semplicemente eliminare ogni riga il cui indice è un multiplo di 6? – user2357112

+0

Non lo sapevo. Ma comunque, voglio fare ciò che intendevo fare lì. Sì, non mi importa dei duplicati, voglio solo eliminare una riga ogni 6 righe per il mio set di validazione. –

risposta

4

sto utilizzando sempre boolean masks per queste cose, si potrebbe prendere in considerazione:

# Mask every sixth row 
mask = (np.arange(images.shape[0]) % 6) != 0 

# Only use the not masked images 
training_images = images[mask] 

Il set di validazione sarebbe quindi ogni elemento mascherato:

validation_images = images[~mask] 

operazioni matematiche su array numpy Per quanto riguarda gli elementi di lavoro, prendere lo modulo (%) verrà eseguito su ciascun elemento e restituirà un altro array con la stessa forma. Lo != 0 funziona anche in base agli elementi e si confronta se il modulo non è zero. Quindi la maschera è solo un array contenente False dove il valore non è uno int * 6 e True dove si trova.

+0

np.arange (images.shape [0]) ti fornisce un array, perché sei in grado di fare (THIS% 6)! = 0? Cosa stai facendo lì e perché funziona? Puoi spiegarlo? –

+0

E questo sembra funzionare, a proposito! –

+0

Ho modificato un piccolo testo alla fine spiegando il contesto delle operazioni. – MSeifert