23

浮動小数点数の大きなデータ セットがあります。それらを反復してnp.log(x)、それぞれを評価します。私は得る

RuntimeWarning: divide by zero encountered in log

これを回避して、このエラーが発生した場合は 0 を返したいと思います。

私は新しい関数を定義することを考えています:

def safe_ln(x):
    #returns: ln(x) but replaces -inf with 0
    l = np.log(x)
    #if l = -inf:
    l = 0
    return l

基本的に、出力をテストする方法が必要ですが、-inf続行する方法がわかりません。ご協力ありがとうございました!

4

7 に答える 7

37

あなたは np 関数を使用しているので、numpy 配列で作業していると推測できますか? これを行う最も効率的な方法は、for ループの代わりに where 関数を使用することです。

myarray= np.random.randint(10,size=10)
result = np.where(myarray>0, np.log(myarray), 0)

それ以外の場合は、単純に log 関数を使用して、穴にパッチを当てることができます。

myarray= np.random.randint(10,size=10)
result = np.log(myarray)
result[result==-np.inf]=0

np.log 関数は、値 0 で使用すると正しく -inf を返すので、本当に 0 を返しますか? どこかで元の値に戻さなければならない場合、ゼロを 1 に変更するという問題が発生します...

于 2012-11-21T18:13:01.683 に答える
25

logforは負の無限大であるためx=0、入力値がゼロかどうかを確認し、そこに必要なものを返すだけです。

def safe_ln(x):
    if x <= 0:
        return 0
    return math.log(x)

EDIT : 小さな編集: 0 以下のすべての値を確認する必要があります。

EDIT 2 :np.logもちろん、numpy 配列で計算する関数です。単一の値を使用する必要がありますmath.log。これは、上記の関数が numpy でどのように見えるかです:

def safe_ln(x, minval=0.0000000001):
    return np.log(x.clip(min=minval))
于 2012-11-21T16:43:05.820 に答える
3

あなたはこれを行うことができます。

def safe_ln(x):
   try:
      l = np.log(x)
   except ZeroDivisionError:
      l = 0
   return l
于 2012-11-21T16:44:09.550 に答える
1

例外処理を使用します。

In [27]: def safe_ln(x):
    try:
        return math.log(x)
    except ValueError:       # np.log(x) might raise some other error though
        return float("-inf")
   ....:     

In [28]: safe_ln(0)
Out[28]: -inf

In [29]: safe_ln(1)
Out[29]: 0.0

In [30]: safe_ln(-100)
Out[30]: -inf
于 2012-11-21T16:43:44.573 に答える
0

あなたができる:

def safe_ln(x):
    #returns: ln(x) but replaces -inf with 0
    try:
        l = np.log(x)
    except RunTimeWarning:
        l = 0
    return l
于 2012-11-21T16:42:17.323 に答える