numpy.heaviside和机器精度

时间:2019-05-04 16:53:59

标签: python numpy

我在numpy.heaviside函数上遇到了一些问题。基本上,当我将相同的值传递给函数时,它会给出不同的结果。

根据它提供的文档

                      0   if x1 < 0
heaviside(x1, x2) =  x2   if x1 == 0
                      1   if x1 > 0

我认为麻烦是x1==0比较。原则上有两个选择:

  1. 检查该值是否在机器精度范围内为零。
  2. 检查该值是否实际上为零。

我认为numpy可以做到1.,但现在我认为它可以做到2。

有什么办法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

我自己解决了。问题似乎确实是numpy.heaviside使用类似于np.equal的零检查。这是一个使用np.isclose的函数。

import numpy as np
def heaviside_close(x1, x2):
    closeCheck = np.isclose(x1, np.zeros_like(x1))
    heavisideBare = np.heaviside(x1, 0.0)
    zeroVal = np.where(closeCheck, x2, 0.0)-np.where(closeCheck, heavisideBare, np.zeros_like(heavisideBare))
    result = heavisideBare+zeroVal
    return result
print(heaviside_close(np.asarray([-1., -0.1, 1e-20, 0.1, 1.]), 0.5))
# >>> [0.  0.  0.5 1.  1. ]
print(np.heaviside(np.asarray([-1., -0.1, 1e-20, 0.1, 1.]), 0.5))
# >>> [0.  0.  1.  1.  1. ]