2011-08-27 97 views
6

我知道如何创建一个屏蔽数组,我想用掩蔽在记录阵列,这样我可以使用命名属性访问这些数据。掩蔽似乎“丢失”当我创建一个蒙面阵列的记录阵列:我怎么能掩盖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')]) 

当我访问这些数据没有被屏蔽的记载:

>>> r.date[0] 
0 

与原来的数组中:

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

     fill_value = 1e+20) 

我该怎么办?记录数组是否不支持掩蔽?浏览网页我已经看到一些代码示例,但似乎并不清楚。希望我能在这里得到一个很好的答案。

回答

3

我还没有找到numpy.ma.mrecords.MaskedRecords多文档,除了简单地提到here。你可以通过研究numpy的单元测试来找到一些关于如何使用它的例子。 (例如 /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

谢谢,我不知道numpy.ma.mrecords。 –

+0

我不假设有一种方法来掩盖个别字段?我的使用情况是添加一个名为“100天高”(或类似的东西)一个新的衍生领域,所以我会想掩盖这一领域的前100条记录。 –

+0

@Nate Reed:我认为这是可能的。你试过类似'data.mask ['price'] [data ['date'] <...] = True'吗? – unutbu