numpy.heaviside и точность машины - PullRequest
1 голос
/ 04 мая 2019

У меня есть некоторые проблемы с функцией 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 Ответ

1 голос
/ 04 мая 2019

Я решил это сам. Проблема, по-видимому, заключается в том, что 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. ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...