Обработка ошибок с плавающей точкой#

Настройки обработки ошибок хранятся в contextvars позволяя разным потокам или асинхронным задачам иметь независимые конфигурации. Для получения дополнительной информации см. Потокобезопасность.

Как NumPy обрабатывает числовые исключения#

По умолчанию 'warn' для invalid, divide, и overflow и 'ignore' для underflow. Но это можно изменить, и можно установить индивидуально для разных типов исключений. Различные поведения:

  • 'ignore' : Не предпринимать действий при возникновении исключения.

  • 'warn' : Вывести RuntimeWarning (через Python warnings модуль).

  • 'raise' : Вызвать FloatingPointError.

  • 'call' : Вызвать указанную функцию.

  • 'print' : Вывести предупреждение напрямую в stdout.

  • 'log' : Записать ошибку в объект Log.

Эти поведения могут быть установлены для всех видов ошибок или конкретных:

  • all : применить ко всем числовым исключениям

  • invalid : когда генерируются NaN

  • divide : деление на ноль (для целых чисел тоже!)

  • overflow : переполнение чисел с плавающей запятой

  • underflow : потери точности при операциях с плавающей запятой

Обратите внимание, что целочисленное деление на ноль обрабатывается тем же механизмом.

Режим обработки ошибок можно настроить numpy.errstate менеджер контекста.

Примеры#

>>> with np.errstate(all='warn'):
...     np.zeros(5, dtype=np.float32) / 0.0
:2: RuntimeWarning: invalid value encountered in divide
array([nan, nan, nan, nan, nan], dtype=float32)
>>> with np.errstate(under='ignore'):
...     np.array([1.e-100])**10
array([0.])
>>> with np.errstate(invalid='raise'):
...     np.sqrt(np.array([-1.]))
...
Traceback (most recent call last):
  File "", line 2, in 
    np.sqrt(np.array([-1.]))
    ~~~~~~~^^^^^^^^^^^^^^^^^
FloatingPointError: invalid value encountered in sqrt
>>> def errorhandler(errstr, errflag):
...     print("saw stupid error!")
>>> with np.errstate(call=errorhandler, all='call'):
...     np.zeros(5, dtype=np.int32) / 0
saw stupid error!
array([nan, nan, nan, nan, nan])

Установка и получение обработки ошибок#

seterr([all, divide, over, under, invalid])

Установить, как обрабатываются ошибки с плавающей запятой.

geterr()

Получите текущий способ обработки ошибок с плавающей запятой.

seterrcall(func)

Установите функцию обратного вызова ошибок с плавающей запятой или объект журнала.

geterrcall()

Возвращает текущую функцию обратного вызова, используемую при ошибках с плавающей запятой.

errstate(**kwargs)

Контекстный менеджер для обработки ошибок с плавающей точкой.