1

単純な1次元のnumpy配列を想定します。

>>> x = np.array([1,3,5,0,3,2])

ここで、操作を実行したいとします1.0/x。私はnumpyでこれを行うことができます:

>>> 1.0/x
array([ 1.        ,  0.33333333,  0.2       ,         inf,  0.33333333,
    0.5       ])

ここでの問題はinf、元の要素値0の無限大()の結果です。これ1.0/0は、未定義の動作の代わりに無限大を返すように見えるためです。

無限大の代わりに、これらのゼロ除算シナリオが発生する独自のカスタム値を提供したいと思います。これはループを使用して実行できることはわかっていますが、この種の操作に慣用的な構文があるかどうかを知りたいと思います。

ここに関連する質問がありますが、それはif何か:(これを行う)else :(何もしない)シナリオのみを扱いますが、私の質問はif何か:(これを行う)else :(それを行う)シナリオです。

4

2 に答える 2

4

後でいつでもパッチを適用できます。

a = 1.0/x
inf_ind = np.isinf(a)
a[inf_ind] = your_value

また

a[inf_ind] = f(x[inf_ind])

これには、最適化された素晴らしい numpy メソッドの邪魔にならないという利点があります。

于 2013-01-24T03:40:56.607 に答える
3

前の回答に基づいて、浮動小数点コールバック モードを設定して、いつ inf 変換を適用する必要があるかを検出することもできます。

ただし、浮動小数点エラーごとに呼び出されるコールバックが見つかりません。

参照: http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

import numpy
class IsDivideError(object):
    def __init__(self):
        self.hasDivideError=False

    def callback(self, x,y):
        self.hasDivideError=True

ide=IsDivideError()
numpy.seterr(divide='call')
numpy.seterrcall(lambda x,y: ide.callback(x,y) )
x = numpy.array([1,3,5,0,3,2])
val=1.0/x
if(ide.hasDivideError):
    val[numpy.isinf(val)]=5
于 2013-01-24T03:57:57.193 に答える