Python np.sqrt(x-a)*np.heaviside(x,a)

Python np.sqrt(x-a)*np.heaviside(x,a)

我正在尝试根据一篇研究论文进行计算。在该计算中,函数的值应该是

在我的模块中,x 和 a 是一维 numpy 数组(长度相同)。在我的第一次尝试中,我将函数实现为

f = np.sqrt(x-a)*SOMETHING*np.heaviside(x,a)

但是对于 x0*NaN = NaN.

之后我也可以将结果数组中的所有 NaN 替换为 0,但这会导致 numpy.sqrt() 的警告输出用于我需要抑制的负值。另一种解决方案是将平方根的参数视为虚数,方法是添加 0j 然后取实部:

f = np.real(np.sqrt(x-a+0j)*SOMETHING*np.heaviside(x,a))

但我觉得这两个解决方案都不是很优雅,第二个解决方案读起来不必要地复杂。在 Python 中是否有更优雅的方法来执行此操作,我在这里缺少?

在这种情况下,您可以使用 np.maximum 作弊,以不计算负数的平方根。 此外,请注意 np.heaviside 不使用 a 作为阈值,而是 0(第二个参数在某些情况下是 heaviside 的输出)。您可以改用 np.where

这是一个例子:

f = np.where(x<a, 0, np.sqrt(np.maximum(x-a, 0))*SOMETHING)

请注意,在这种特定情况下,表达式可以简化,甚至不需要 np.where(因为 np.sqrt(np.maximum(x-a, 0)) 给出 0)。因此,您可以简单地写:

f = np.sqrt(np.maximum(x-a, 0))*SOMETHING