numpy:使用-inf而不是nans登录

时间:2013-08-12 15:46:28

标签: python numpy nan logarithm

是否有一种有效的方法为numpy数组编写类似日志的函数,为负数提供-inf

我想要的行为是:

>>> log_inf(exp(1))
1.0

>>> log_inf(0)
-inf

>>> log_inf(-1)
-inf
对于任何负数,

返回-inf

编辑:目前我正在使用clip替换0的负数,但它有效但效果如何?

3 个答案:

答案 0 :(得分:3)

您可以使用numpy.log对负数进行条件测试:

import numpy as np
def log_inf(x):
    return np.log(x) if x>0 else -float('Inf')


log_inf(-1)
-inf
log_inf(0)
-inf
log_inf(np.exp(1))
1.0

进行类型检查:

def log_inf(x):
    if not isinstance(x, (list, tuple, np.ndarray)):
        return np.log(x) if x>0 else -float('Inf')
    else:
        pass #could insert array handling here

答案 1 :(得分:2)

对于numpy 数组,您可以计算日志,然后应用一个简单的掩码。

>>> a=np.exp(np.arange(-3,3,dtype=np.float))
>>> b=np.log(a)
>>> b
array([-3., -2., -1.,  0.,  1.,  2.])

>>> b[b<=0]=-np.inf
>>> b
array([-inf, -inf, -inf, -inf,   1.,   2.])

要节省一点时间并选择调用或创建新阵列:

def inf_log(arr,copy=False):
    mask= (arr<=1)
    notmask= ~mask
    if copy==True:
        out=arr.copy()
        out[notmask]=np.log(out[notmask])
        out[mask]=-np.inf
        return out
    else:
        arr[notmask]=np.log(arr[notmask])
        arr[mask]=-np.inf

答案 2 :(得分:1)

例如,基于10日志,其中log(x)10**x=100相反,从数学上讲,实现10**(-inf)==-1是不可能的。

但有可能实现10**(-inf)==0。在numpy您已经获得:

np.log(0)==-np.inf
#True

10**(-np.inf)==0
#True