2011-07-02 4 views
5
import numpy as np 
import numpy.ma as ma 

"""This operates as expected with one value masked""" 
a = [0., 1., 1.e20, 9.] 
error_value = 1.e20 
b = ma.masked_values(a, error_value) 
print b 

"""This does not, all values are masked """ 
d = [0., 1., 'NA', 9.] 
error_value = 'NA' 
e = ma.masked_values(d, error_value) 
print e 

データの欠落を示すために 'nan'、 'NA'、 'None'などの値を使用するにはどうすればよいですか?ナンシーマスクされた配列 - 欠損値を示す

答えて

4

テキストファイルなどからデータを取得していますか?もしそうなら、私はあなたのマスクされた値を指定するには、直接genfromtxt機能を使用することをお勧めしたい:

In [149]: f = StringIO('0.0, 1.0, NA, 9.0') 

In [150]: a = np.genfromtxt(f, delimiter=',', missing_values='NA', usemask=True) 

In [151]: a 
Out[151]: 
masked_array(data = [0.0 1.0 -- 9.0], 
      mask = [False False True False], 
     fill_value = 1e+20) 

私はあなたの例では、問題は、あなたがnumpyの配列を初期化するために使用しているPythonのリストは、(異質なタイプを持っているということだと思います浮動小数点数と文字列)。値はnumpy配列の文字列に強制されますが、masked_values関数は浮動小数点の等価性を使用して奇妙な結果をもたらします。ここで

は、オブジェクトDTYPEを持つ配列を作成することによってこれを克服する一つの方法です:

In [152]: d = np.array([0., 1., 'NA', 9.], dtype=object) 

In [153]: e = ma.masked_values(d, 'NA') 

In [154]: e 
Out[154]: 
masked_array(data = [0.0 1.0 -- 9.0], 
      mask = [False False True False], 
     fill_value = ?) 

結果はフロートDTYPEを持っているので、あなたが最初のソリューションを好むかもしれません。

+0

私の配列(メモリ内)に欠損値情報を保存したいと思います。マスクを使用する私の目的は、欠損値を無視して配列を平均化できるようにすることです。 maドキュメントで指摘されているように、maの目的は、欠損値または無効な値を持つデータの処理を許可することです。実際のデータ系列「NA」では、欠損値をマークするために「なし」などが使用されます。 "fill_value"オプションは、私の目的を達成するための手段を提供しますか? –

+0

@Dick:はい、上記の両方の方法が必要なものを達成します。それらは、要素3が欠落しているという情報を保持しています(fill_valueはそれほど重要でない場合はそれほど重要ではありません)。たとえば、 'a.mean()'や 'e.mean()'を呼び出して、結果が '3.33'であることを確認することができます。上記の例では、 "NA"の代わりにデータ系列が欠損値に使用する文字/文字列を使用できます。 – ars

0

このソリューションは機能し、アレイのコピーの作成を強制します。

a_true = (a == 'NA') 

a[a_true] = 1.e20 

a = a.astype(float) 

print a 

error_value = 1.e20 

b = ma.masked_values(a, error_value) 

print b