-inf
是否有一种有效的方法可以为给出负数的 numpy 数组编写类似日志的函数?
我想要的行为是:
>>> log_inf(exp(1))
1.0
>>> log_inf(0)
-inf
>>> log_inf(-1)
-inf
返回-inf
任何负数。
编辑:目前我用clip
负数代替0
,它有效但有效吗?
您可以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
对于 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
例如,给定一个基本10
对数,其中log(x)
是 的倒数10**x=100
,在数学上是不可能实现的10**(-inf)==-1
。
但有可能实现10**(-inf)==0
。在numpy
你已经得到:
np.log(0)==-np.inf
#True
和:
10**(-np.inf)==0
#True
另一种可能的解决方案是:
np.nan_to_num(np.log(data), neginf=0)
或者出于多种目的,使用 Numpy 掩码数组可能效果很好:
np.ma.log(data)