2017-05-29 22 views
2

np.ma.masked_equalまたはmasked_valuesは、値が配列ではなくスカラーである場合、Falseのマスクを作成しないという点で少し驚いています。numpy masked_array maskがタイプを変更する

例:

y = np.arange(10) 
yy = np.ma.masked_equal(y,0) 

y = np.arange(1,10) 
yy = np.ma.masked_equal(y,0) 

スカラーFalseに設定されたマスクでマスク配列を生成しながら、マスクされたアレイは、10のFalseの値の配列であるマスクを小枝もたらします。その結果、私のコードでは、私はマスクは、アレイ内のすべてのエントリと一致するかどうかを事前に知っていないことを考えると、私は明示的にチェックすることを強制しています:

yy=np.ma.masked_values(y,0) 
if np.isscalar(yy.mask): 
    yy.mask=np.zeros(y.shape,dtype=bool) 

これは私には過労です。この行動の理由は何ですか?それを避ける方法はありますか?

答えて

2

あなたは、単にMaskedArray youselfを作成することができます。

yy = np.ma.MaskedArray(y, mask=(y==0)) 

numpyのは、メモリ要件を最小限に抑え、MaskedArrayがマスクされていない場合の計算を高速化しようとしているようです。マスクされた配列は、無効なエントリを持っていないことを示す

numpy.ma.nomask

値。 nomaskは、マスクが不要なときに計算を高速化するために内部的に使用されます。

あなたがチェックした場合:

>>> np.ma.nomask 
False 

をだから、単一Falseは "何のマスク" を表していません。だから、あなたも(それはgarantueed constantです)maskedarr.mask is np.ma.nomaskをチェックすることができ:

yy = some_operation_that_creates_a_masked_array 
if yy.mask is np.ma.nomask: 
    yy.mask = np.zeros(yy.shape, dtype=bool) 

その後、もう少しコンテキストnp.isscalarを運ぶこと。

+1

ありがとうございます。 masked_equalやmasked_valuesを使用することに熱心でしたが、なぜnumpyがmasked_arrayを直接作成するのではなく、メモリ要件を最小限に抑えようとしているのかを理解しているのか分かりません。 –

関連する問題