1

-inf是否有一种有效的方法可以为给出负数的 numpy 数组编写类似日志的函数?

我想要的行为是:

>>> log_inf(exp(1))
1.0

>>> log_inf(0)
-inf

>>> log_inf(-1)
-inf

返回-inf任何负数。

编辑:目前我用clip负数代替0,它有效但有效吗?

4

4 回答 4

4

您可以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
于 2013-08-12T16:01:07.503 回答
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
于 2013-08-12T16:26:37.513 回答
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
于 2013-08-12T16:01:18.167 回答
1

另一种可能的解决方案是:

np.nan_to_num(np.log(data), neginf=0)

或者出于多种目的,使用 Numpy 掩码数组可能效果很好:

np.ma.log(data)
于 2021-10-19T19:40:19.313 回答