Как проверить переполнение числа без предупреждения в Python? - PullRequest
4 голосов
/ 19 февраля 2012

У меня есть выражение, которое переполняется для определенных значений параметров. В этом случае я вычислил, каким должен быть асимптотический результат, используя ручку и бумагу, и когда у меня есть такой случай, я просто заменяю его аналитическим выражением.

В данный момент мой код работает примерно так:

values = ExpressionThatOverFlows()
# Check the ones that overflow
indOverFlow = isnan(values)
# Set them to the values I derived by pen and paper
values[indOverFlow] = derivedValues

Моя проблема в том, что ввод / вывод взрывается с «предупреждениями». Я знаю, что это хорошо, что это предупреждает меня, но я явно позаботился об этом, поэтому я хочу заставить их замолчать. Обратите внимание, что я не хочу отключать все типы предупреждений о «переполнении», только те, которые приведены здесь. Я думал, что что-то вроде этого будет работать, но это не так:

try:
   values = ExpressionThatOverFlows()
except Warning:
   pass
# and the rest of the code as it is

Я проверил, но, похоже, я просто нашел способ заставить замолчать эти предупреждения на весь сеанс или навсегда, но это, как я уже говорил, не то, что я хочу.

Спасибо за вашу помощь, высоко ценится.

РЕДАКТИРОВАТЬ: Вот код гораздо меньше, который генерирует мою проблему:

from scipy import log1p, exp
from numpy import array, isnan

a = array([0.2222, 500.3, 0.3, 700.8, 0.111])

values = log1p(-exp(-exp(10**a - 9**a)))

print values # Note the nan's

indOverflow = isnan(values)
values[indOverflow] = 0

Обратите внимание, как я исправляю проблему «вручную» в конце, но в I / O происходит следующее:

Warning: overflow encountered in power
Warning: overflow encountered in power
Warning: invalid value encountered in subtract

Я выполняю такого рода вычисления в цикле, поэтому я хочу заставить замолчать эти сообщения (поскольку они уже исправлены и, кроме того, для их печати требуется много времени)

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Вы можете отключить предупреждения о переполнении с помощью numpy.seterr(over='ignore'), см. http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

2 голосов
/ 19 февраля 2012

Если в предупреждениях используется система предупреждений Python, вы можете использовать функции catch_warnings() и simplefilter() из модуля предупреждений , как показано в документации .

Если предупреждения не используют эту систему, она более сложная.

0 голосов
/ 20 февраля 2012

Лучший подход состоит в том, чтобы вручную проверить ваше выражение и выяснить, какой диапазон входных параметров может быть точно обработан вашим явным кодом. Возможно, что значительная потеря точности происходит намного раньше, чем числовое переполнение.

Затем вы должны иметь явное выражение «if» для ваших входных переменных и использовать асимптотическое выражение для всех значений, для которых числовая ошибка, как известно, слишком велика. Возможно, вам потребуется увеличить число слагаемых в асимптотическом расширении, например, делая серию Тейлора о бесконечности. Чтобы избежать утомительного выполнения этого вручную, вы можете обнаружить, что maxima весьма полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...