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_array
fix_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.log
今mylog
と同じ動作を持っていますが、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
、感謝:私は、独自ドメインのマスキングを追加しませんカスタム
log
を定義することができますようにが見えます。正直なところ、これを回避する方法はないと思った。また、この例では 'np.ma.log'関数を使っていることに気付かず、' np.log'でテストしましたが、同じ効果があります。あなたの 'mylog'の定義には副作用があります。私はこれを表示し、これを避ける方法を要求するために質問を更新しました。 – salotz