Python 为日志定义boudned ufunc

Python 为日志定义boudned ufunc,python,numpy,Python,Numpy,我试图定义一个函数log\u bounded,该函数与numpy的log函数相同,用于正输入,但对于非正输入,它会给出一个很大的负数。我需要它是一个可以接受数组作为输入的ufunc 到目前为止,我已经: def log_bounded(x,verysmall=np.exp(-100)): return np.log(np.maximum(x,verysmall)) 此操作有效,负输入返回-100: >>> log_bounded(2.72) 1.00063188030

我试图定义一个函数
log\u bounded
,该函数与numpy的
log
函数相同,用于正输入,但对于非正输入,它会给出一个很大的负数。我需要它是一个可以接受数组作为输入的ufunc

到目前为止,我已经:

def log_bounded(x,verysmall=np.exp(-100)):
    return np.log(np.maximum(x,verysmall))
此操作有效,负输入返回-100:

>>> log_bounded(2.72)
1.000631880307906
>>> log_bounded(-5)
-100.0
但我希望它返回一个更低的值,比如-10**10。我认为理想的方法是检查x的值并直接返回低值,而不是记录接近零的值,例如

def log_bounded_if(x, verylow=-10**10):
    if x > 0:
        return np.log(x)
    else:
        return verylow
但是,这个函数不会对数组进行元素操作,因为
if
试图对整个数组运行一次

Scipy可以使用
Scipy.max(Scipy.log(x),verylow)
完成这项工作,因为
Scipy.log
在非正输入上的计算结果为负无穷大。但是,我需要使用numpy,因为它将与numba的
autojit一起运行,而scipy似乎消除了速度优势。

您可以通过

最小解决方案:

将numpy导入为np
def log_有界(x,verylow=-10**10):
y=np.log(x)
y[x 0:
y=np.log(x)
其他:
y=verylow
其他:
y=np.空的(x)
y[x>0]=np.log(x[x>0])#仅在需要时计算日志

y[x您不妨为“verylow”条目节省昂贵的“log”操作:
out=np.empty_like(x,dtype=float);mask=x Falko,您的解决方案可以在数组上运行,但如果x只是一个数字,则会抛出一个错误。好吧,我不知道可能存在标量输入(不是数组类型)。我相应地更新了我的答案。顺便说一句,我加入了Jaime的建议。谢谢!谢谢Falko-你的答案正是我想要的。尽管出于我还不明白的原因,它让我失去了numba的autojit相对于np.log的速度提升。(另外,为了让它与numba一起工作,我不得不删除关键字参数verylow。)
import numpy as np

def log_bounded(x, verylow=-10**10):
    if np.isscalar(x):               # handle scalars as well
        if x > 0:
            y = np.log(x)
        else:
            y = verylow
    else:
        y = np.empty_like(x)
        y[x > 0] = np.log(x[x > 0])  # compute log only where needed
        y[x <= 0] = verylow
    return y

print log_bounded(-3), log_bounded(np.arange(-2, 3)), log_bounded(3)