2011-12-23 23 views
5

¿Hay alguna manera de enumerar las ubicaciones no enmascaradas de una numpy ndarray enmascarada (por ejemplo, en la forma en que ndenumerate lo hace para ndarrays normal, pero omitiendo todas las entradas enmascaradas)?numpy: ndenumerate para matrices enmascaradas?

EDITAR: para ser más precisos: la enumeración no solo debe omitir las entradas enmascaradas, sino también mostrar los índices de los no enmascarados en la matriz original. P.ej. si los primeros cinco elementos de una matriz de 1-d están enmascarados, y la siguiente tiene un valor sin máscara de 3, entonces la enumeración debería comenzar con algo como ((5,), 3), ....

Gracias!

PD: tenga en cuenta que, aunque es posible aplicar ndenumerate a un ndarray enmascarado, la enumeración resultante no discrimina entre sus entradas enmascaradas y normales. De hecho, ndenumerate no solo no filtra las entradas enmascaradas de la enumeración, sino que ni siquiera reemplaza los valores enumerados con la constante masked. Por lo tanto, no se puede adaptar ndenumerate para esta tarea simplemente envolviendo ndenumerate con un filtro adecuado.

+0

vistazo a la función comprimido de matrices ma – tillsten

Respuesta

2

¿Qué tal:

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 

que 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

Puede acceder sólo a las entradas válidas utilizando inversa de una máscara como un índice:

>>> 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 

Ver this de detalles.

La enumeración más entradas válidas sólo con los índices de la matriz original:

>>> 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 
Cuestiones relacionadas