2011-12-23 13 views
5

C'è un modo per enumerare sopra le posizioni non mascherate di un mascherato numpy ndarray (ad esempio nel modo in cui lo ndenumerate lo fa per il normale ndarrays, ma omettendo tutte le voci mascherate)?numpy: ndenumerate per gli array mascherati?

MODIFICA: per essere più precisi: l'enumerazione non deve solo saltare le voci mascherate, ma anche mostrare gli indici di quelli non mascherati nell'array originale. Per esempio. se i primi cinque elementi di un array 1-d sono mascherati e il successivo ha un valore non mascherato di 3, l'enumerazione dovrebbe iniziare con qualcosa come ((5,), 3), ....

Grazie!

PS: noti che, anche se è possibile applicare ndenumerate ad un mascherato ndarray, l'enumerazione risultante non discrimina tra le voci mascherati e normali. Infatti, ndenumerate non solo non filtra le voci mascherate dall'enumerazione, ma non sostituisce nemmeno i valori enumerati con la costante masked. Pertanto, non è possibile adattare ndenumerate per questa attività semplicemente avvolgendo ndenumerate con un filtro adatto.

+0

cerca nella funzione compresso di array MA – tillsten

risposta

2

ne dite:

import numpy as np 
import itertools 

def maenumerate(marr): 
    mask = ~marr.mask.ravel() 
    for i, m in itertools.izip(np.ndenumerate(marr), mask): 
     if m: yield i 

N = 12 
a = np.arange(N).reshape(2, 2, 3)+10 

b = np.ma.array(a, mask = (a%5 == 0)) 
for i, val in maenumerate(b): 
    print i, val 

che produce

(0, 0, 1) 11 
(0, 0, 2) 12 
(0, 1, 0) 13 
(0, 1, 1) 14 
(1, 0, 0) 16 
(1, 0, 1) 17 
(1, 0, 2) 18 
(1, 1, 0) 19 
(1, 1, 2) 21 
7

È possibile accedere solo le voci valide utilizzando inversa di una maschera come indice:

>>> import numpy as np 
>>> import numpy.ma as ma 
>>> x = np.array([11, 22, -1, 44]) 
>>> m_arr = ma.masked_array(x, mask=[0, 0, 1, 0]) 
>>> for index, i in np.ndenumerate(m_arr[~m_arr.mask]): 
     print index, i 
(0,) 11 
(1,) 22 
(2,) 44 

Vedi this per dettagli.

L'enumerazione sulle scritture valide solo con indici dell'array originale:

>>> for (index, val), m in zip(np.ndenumerate(m_arr), m_arr.mask): 
     if not m: 
     print index, val 
(0,) 11 
(1,) 22 
(3,) 44 
Problemi correlati