Почему в этом случае numpy .exp () выдает предупреждение о переполнении? - PullRequest
1 голос
/ 21 июня 2020

У меня есть следующий воспроизводимый скрипт:

import numpy as np

c0, c1 = 0.000032, 3

S_test = np.ones((3,3), dtype=float)*300000
S_test[1,1] = 2000


np.where(S_test > 2000, 1, 1 - 1 / np.exp((c0 * S_test) ** c1) )

RuntimeWarning: overflow encountered in exp

array([[1.00000000e+00, 1.00000000e+00, 1.00000000e+00],
       [1.00000000e+00, 2.62109643e-04, 1.00000000e+00],
       [1.00000000e+00, 1.00000000e+00, 1.00000000e+00]])

Я пытаюсь выяснить 1) Почему я получаю эту ошибку переполнения и 2) как с ней справиться, чтобы избежать просто игнорируйте его, потому что я не совсем уверен, каковы последствия его игнорирования в первую очередь.

np.where() должен сначала распознать, где S_test > 2000, а затем вернуть 1 для этих значений, альтернативно, где это условие не выполняется np.where() должно возвращать 1 - 1 / np.exp((c0 * S_test) ** c1)

Я пытался отдельно вычислить 1 - 1 / np.exp((c0 * 2000) ** c1), и это оценивается очень хорошо, как я и ожидал.

Любое понимание было бы замечательно.

Ответы [ 2 ]

4 голосов
/ 21 июня 2020

np.where оценивает оба операнда.

Если вы действительно хотите избежать предупреждения, вы можете сделать, например, что-то вроде этого: https://github.com/scipy/scipy/blob/master/scipy/_lib/_util.py#L31

0 голосов
/ 21 июня 2020

Вы получите ошибку, потому что все аргументы np.where полностью вычислены. Вы можете сделать это:

S_test_capped = np.where(S_test > 2000, 2000, S_test)
np.where(S_test > 2000, 1, 1 - 1 / np.exp((c0 * S_test_capped) ** c1) )

или просто отключить предупреждения:

old_settings = np.seterr(over='ignore')
np.where(S_test > 2000, 1, 1 - 1 / np.exp((c0 * S_test) ** c1) )
np.seterr(**old_settings) # restore warning settings
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...