2017-10-27 16 views
1

をマスクし提供します:の操作は無効な値がnumpyの<a href="https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html#operations-on-masked-arrays" rel="nofollow noreferrer">operations on numpy arrays</a>にマスクされたアレイ上の文書から

numpy.maモジュールが最もufuncsの特定の実装が付属しています。単項およびバイナリ(ログや除算など)の有効性ドメインを持つ関数の入力がマスクされているか、妥当性ドメインから外れたときにマスクされた定数を返します。例えば:

ma.log([-1, 0, 1, 2]) 
masked_array(data = [-- -- 0.0 0.69314718056], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

私は問題というのが私のために持っています計算私はそれらの無効な操作がどこで作られたのか知る必要があります。具体的には、私が代わりにこれをしたいと思います:この質問の危険に

ma.log([-1, 0, 1, 2]) 
masked_array(data = [np.nan -- 0.0 0.69314718056], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

を私の主な質問の会話であることは次のとおりです。

得るための良い解決策は何算出し、無効な値が(これらは「固定」このmasked_arrayfix_invalidなど、np.nanやnp.infなど)はマスクされた値に変換されません。

私の現在の解決策は、masked_array.dataで関数を計算し、マスクされた配列を元のマスクで再構築することです。しかし、私は、ユーザからの任意の関数をさまざまな配列にマップするアプリケーションを作成しています。その中にはマスクされているものとそうでないものがあり、マスクされた配列のために特別なハンドラを避けることを検討しています。さらに、これらの配列はMISSING、NaN、Infの区別があり、重要なのはmaskedの代わりにnp.nanの配列を使うだけではなりません。


さらに、この動作がなぜ存在するのかについての意見があれば、私は知りたいと思っています。マスクされていない値に対する操作の結果の妥当性は実際にはユーザーの責任であるため、fix_invalid関数を使用して「クリーンアップ」することができるので、同じ操作でこれを行うのは奇妙なことです。

numpyの値の欠落の進行状況を知っている人なら、最も古いものとしてpostsは2011-2012のものです。


EDIT:2017年10月30日

がhpauljの答えに追加するには、ドメインを変更したログ関数の定義には、numpy名前空間のログの動作に副作用があります。

In [1]: import numpy as np 

In [2]: np.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: divide by zero encountered in log 
    #!/home/salotz/anaconda3/bin/python 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: invalid value encountered in log 
    #!/home/salotz/anaconda3/bin/python 
Out[2]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

In [3]: mylog = np.ma.core._MaskedUnaryOperation(np.core.umath.log) 

In [4]: np.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: divide by zero encountered in log 
    #!/home/salotz/anaconda3/bin/python 
/home/salotz/anaconda3/bin/ipython:1: RuntimeWarning: invalid value encountered in log 
    #!/home/salotz/anaconda3/bin/python 
Out[4]: 
masked_array(data = [-- -inf 0.0 0.6931471805599453], 
      mask = [ True False False False], 
     fill_value = 1e+20) 

np.logmylogと同じ動作を持っていますが、np.ma.logは変更されません。これを回避する方法は、

In [5]: np.ma.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
Out[5]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 

ありますか?

Python 3.6.2 :: Anaconda custom (64-bit)とnumpyの1.12.1

答えて

3

を使用しただけでここで起こっているように見えるものを明確

np.ma.log実行引数のnp.log、それは警告トラップ:nan

In [26]: np.log([-1,0,1,2]) 
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log 
    #!/usr/bin/python3 
/usr/local/bin/ipython3:1: RuntimeWarning: invalid value encountered in log 
    #!/usr/bin/python3 
Out[26]: array([  nan,  -inf, 0.  , 0.69314718]) 

またマスクを値は-infです。そして、明らかにコピーこれらdataスロットに元の値:

In [27]: np.ma.log([-1,0,1,2]) 
Out[27]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 
In [28]: _.data 
Out[28]: array([-1.  , 0.  , 0.  , 0.69314718]) 

(PY3で実行されている。numpyのバージョン1.13.1)

は、このマスキング動作はma.logに固有のものではありません。 np.ma.coreではそれがfilldomain属性で定義され、そのクラス

In [41]: type(np.ma.log) 
Out[41]: numpy.ma.core._MaskedUnaryOperation 

によって決定されます。

log = _MaskedUnaryOperation(umath.log, 1.0, 
         _DomainGreater(0.0)) 

ので、有効なドメイン(マスクされていないが)> 0である:

In [47]: np.ma.log.domain([-1,0,1,2]) 
Out[47]: array([ True, True, False, False], dtype=bool) 

ドメインマスクはor-ed

です同じ値を持つ

です。このポストから多くのことを学ぶ

In [58]: mylog = np.ma.core._MaskedUnaryOperation(np.core.umath.log) 
In [59]: mylog([-1,0,1,2]) 
Out[59]: 
masked_array(data = [  nan  -inf 0.   0.69314718], 
      mask = False, 
     fill_value = 1e+20) 

In [63]: np.ma.masked_array([-1,0,1,2],[1,0,0,0]) 
Out[63]: 
masked_array(data = [-- 0 1 2], 
      mask = [ True False False False], 
     fill_value = 999999) 
In [64]: np.ma.log(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
Out[64]: 
masked_array(data = [-- -- 0.0 0.6931471805599453], 
      mask = [ True True False False], 
     fill_value = 1e+20) 
In [65]: mylog(np.ma.masked_array([-1,0,1,2],[1,0,0,0])) 
Out[65]: 
masked_array(data = [-- -inf 0.0 0.6931471805599453], 
      mask = [ True False False False], 
     fill_value = 1e+20) 
+0

、感謝:私は、独自ドメインのマスキングを追加しませんカスタムlogを定義することができますように

が見えます。正直なところ、これを回避する方法はないと思った。また、この例では 'np.ma.log'関数を使っていることに気付かず、' np.log'でテストしましたが、同じ効果があります。あなたの 'mylog'の定義には副作用があります。私はこれを表示し、これを避ける方法を要求するために質問を更新しました。 – salotz

関連する問題