2011-08-27 92 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