2011-08-27 12 views
6

Entiendo cómo crear una matriz enmascarada, y me gustaría usar el enmascaramiento en una matriz de registros para poder acceder a estos datos usando atributos con nombre. El enmascaramiento parece estar "perdido" cuando se crea una matriz de registro de una serie de máscaras:¿Cómo puedo enmascarar elementos de una matriz de registros en Numpy?

>>> data = np.ma.array(np.ma.zeros(30, dtype=[('date', '|O4'), ('price', '<f8')]),mask=[i<10 for i in range(30)]) 
>>> data 
masked_array(data = [(--, --) (--, --) (--, --) (--, --) (--, --) (--, --) (--, --) (--, --) 
(--, --) (--, --) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) 
(0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0) (0, 0.0)], 
     mask = [(True, True) (True, True) (True, True) (True, True) (True, True) 
(True, True) (True, True) (True, True) (True, True) (True, True) 
(False, False) (False, False) (False, False) (False, False) (False, False) 
(False, False) (False, False) (False, False) (False, False) (False, False) 
(False, False) (False, False) (False, False) (False, False) (False, False) 
(False, False) (False, False) (False, False) (False, False) (False, False)], 
    fill_value = ('?', 1e+20), 
     dtype = [('date', '|O4'), ('price', '<f8')]) 

>>> r = data.view(np.recarray) 
>>> r 
rec.array([(0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), 
      (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0)], 
      dtype=[('date', '|O4'), ('price', '<f8')]) 

Cuando tengo acceso a un registro de los datos no se enmascara:

>>> r.date[0] 
0 

A diferencia de la matriz original:

>>> data['date'][0] 
masked_array(data = --, 
      mask = True, 
     fill_value = 1e+20) 

     fill_value = 1e+20) 

¿Qué puedo hacer? ¿La matriz de grabación no admite el enmascaramiento? Navegando en la web he visto algunos ejemplos de código que parecen sugerir lo contrario, pero no era muy claro. Esperando poder obtener una buena respuesta aquí.

Respuesta

3

No he encontrado mucha documentación sobre numpy.ma.mrecords.MaskedRecords, a excepción de una breve mención here. Puede encontrar algunos ejemplos sobre cómo usarlo estudiando las pruebas unitarias que vienen con numpy. (por ejemplo, /usr/lib/python2.6/dist-packages/numpy/ma/tests/test_mrecords.py).

import numpy as np 
import numpy.ma.mrecords as mrecords 

data = np.ma.array(
    np.ma.zeros(30, dtype=[('date', '|O4'), ('price', '<f8')]), 
    mask=[i<10 for i in range(30)]) 

r = data.view(mrecords.mrecarray) 

print(r.date[0]) 
# -- 
+0

Gracias, no sabía sobre numpy.ma.mrecords. –

+0

Supongo que no hay una forma de enmascarar campos individuales? Mi caso de uso es agregar un nuevo campo derivado llamado "100 días de duración" (o algo similar) por lo que me gustaría enmascarar este campo para los primeros 100 registros. –

+0

@Nate Reed: creo que es posible. ¿Has probado algo como 'data.mask ['price'] [data ['date'] <...] = True'? – unutbu

Cuestiones relacionadas