是否有一种有效的方法为numpy数组编写类似日志的函数,为负数提供-inf
?
我想要的行为是:
>>> log_inf(exp(1))
1.0
>>> log_inf(0)
-inf
>>> log_inf(-1)
-inf
对于任何负数,返回-inf
。
编辑:目前我正在使用clip
替换0
的负数,但它有效但效果如何?
答案 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