2011-08-27 25 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) 

どうすればよいですか?レコード配列はマスキングをサポートしていませんか? Web上でのブラウジング他に示唆しているようなコード例をいくつか見てきましたが、あまり明確ではありませんでした。私はここで良い答えを得ることができます願っています。

答えて

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 '[price'] [data ['date'] <...] = True'のようなものを試しましたか? – unutbu

関連する問題