Функция seterr
Функция seterr управляет тем, как NumPy реагирует на ошибки
при выполнении числовых операций. Она позволяет настроить поведение
для различных типов ошибок: деление на ноль, переполнение,
выход за пределы допустимых значений и другие. Функция принимает
словарь, в котором ключами являются типы ошибок, а значениями -
режимы обработки. Она возвращает предыдущие настройки в виде словаря.
Синтаксис
np.seterr(divide='mode', over='mode', under='mode', invalid='mode')
В качестве параметров передаются строки, определяющие режим
обработки для конкретного типа ошибки. Возможные значения
режимов: 'ignore' (игнорировать ошибку), 'warn'
(выводить предупреждение), 'raise' (генерировать исключение),
'call' (вызвать пользовательскую функцию) и
'log' (записывать ошибку в лог).
Пример
Рассмотрим базовое использование функции seterr для настройки
реакции на деление на ноль:
import numpy as np
# Сохраняем текущие настройки
old_settings = np.seterr(divide='warn')
print("Текущие настройки:", old_settings)
# Операция, вызывающая деление на ноль
arr = np.array([1.0, 2.0, 3.0])
res = arr / 0.0
print(res)
# Возвращаем старые настройки
np.seterr(**old_settings)
Результат выполнения кода:
Текущие настройки: {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
RuntimeWarning: divide by zero encountered in divide
[inf inf inf]
В этом примере мы настроили реакцию на деление на ноль как предупреждение, после чего выполнили операцию, вызвавшую ошибку, и получили предупреждение, а также бесконечность в результате.
Пример
Настройка функции seterr на генерацию исключения при
переполнении:
import numpy as np
# Настраиваем переполнение как исключение
old_settings = np.seterr(over='raise')
try:
# Создаем массив и вызываем переполнение
arr = np.array([1e308, 1e308])
res = arr * 1e308
print(res)
except FloatingPointError as e:
print("Перехвачено исключение:", e)
finally:
# Восстанавливаем настройки
np.seterr(**old_settings)
Результат выполнения кода:
Перехвачено исключение: overflow encountered in multiply
Теперь при возникновении переполнения вместо молчаливого вычисления возвращается бесконечность, а генерируется исключение, которое можно перехватить и обработать.
Пример
Настройка функции seterr с использованием режима
'ignore' для игнорирования ошибок:
import numpy as np
# Игнорируем все ошибки
old_settings = np.seterr(all='ignore')
# Операции, которые могли бы вызвать ошибки
arr1 = np.array([1.0, 2.0, 3.0])
res1 = arr1 / 0.0
print("Результат деления на ноль:", res1)
arr2 = np.array([1e308, 1e308])
res2 = arr2 * 1e308
print("Результат переполнения:", res2)
# Восстанавливаем настройки
np.seterr(**old_settings)
Результат выполнения кода:
Результат деления на ноль: [inf inf inf]
Результат переполнения: [inf inf]
При использовании режима 'ignore' ошибки не выводятся,
но результаты вычислений всё равно содержат специальные значения,
такие как inf или nan.
Пример
Сохранение и восстановление настроек с помощью функции seterr:
import numpy as np
# Сохраняем текущие настройки
old_settings = np.seterr()
print("Исходные настройки:", old_settings)
# Изменяем настройки
np.seterr(divide='ignore', over='warn')
print("Новые настройки:", np.seterr())
# Восстанавливаем исходные настройки
np.seterr(**old_settings)
print("Восстановленные настройки:", np.seterr())
Результат выполнения кода:
Исходные настройки: {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
Новые настройки: {'divide': 'ignore', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
Восстановленные настройки: {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
Важно всегда сохранять старые настройки и восстанавливать их после выполнения операций, чтобы не влиять на другое поведение программы.
Смотрите также
-
функцию
geterr,
которая возвращает текущие настройки обработки ошибок -
функцию
seterrcall,
которая устанавливает пользовательскую функцию для режима 'call' -
функцию
geterrcall,
которая возвращает текущую пользовательскую функцию для режима 'call' -
функцию
set_printoptions,
которая настраивает форматирование вывода массивов