2012-02-15 12 views
13

Ho due array NumPy, per esempio:Come filtrare una matrice numpy usando i valori di un'altra matrice?

a = [1,2,3,4,5] 

e una matrice di filtro, ad esempio:

f = [False, True, False, False, True] 

len(a) == len(f) 

Come posso ottenere un nuovo array NumPy con solo i valori in cui lo stesso indice f è vero? Nel mio caso: [2, 5].

Secondo la soluzione accettata (con valori diversi):

>>> a = numpy.array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
>>> b = numpy.array([True, False, True, False, True, False, True, False, True, False]) 
>>> a[b] 
array([1, 3, 5, 7, 9]) 
+2

sembra che b sia una lista non una matrice, b deve essere una matrice booleana. Prova 'b = np.asarray (b, 'bool')' –

risposta

22

NumPy supporta boolean indexing

a[f] 

Questo presuppone che a e f sono array NumPy piuttosto che liste Python (come nella questione). È possibile convertire con f = np.array(f).

+0

Questo non sembra funzionare: vedi domanda. –

+2

Assicurati che 'b' sia una matrice numpy. Aggiornato nella risposta. – YXD

+1

L'ho modificato in base alla soluzione e commento nella domanda ... ora funziona, grazie! –

3

Se non si dispone già bisogno di array NumPy, ecco un elenco semplice:

import itertools 
print itertools.compress(a, f) 

Per pre-2.7 versioni di Python, è necessario roll your own (vedi manuale):

def compress(data, selectors): 
    return (d for d, s in itertools.izip(data, selectors) if s)