Изменить поведение np.seterr только внутри функции - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу изменить обработку ошибок с плавающей точкой numpy внутри одной функции.

Типичный пример:

import numpy as np

def f():
    np.seterr(all='raise')
    # Do some other stuff

print(np.seterr())
# {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}

f()
print(np.seterr())
# {'divide': 'raise', 'over': 'raise', 'under': 'raise', 'invalid': 'raise'}

Я бы хотел, чтобы вызов f не изменил вывод np.seterr(), я не знаю, как это сделать.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Используйте менеджер контекста numpy.errstate для временного изменения обработки ошибок с плавающей запятой:

def f():
    with numpy.errstate(all='raise'):
        ...

Имейте в виду, что, хотя это временное изменение, оно все еще глобально для всех потокови сопрограммы.На момент написания этой статьи NumPy не предлагал опции для локальных потоков или настроек ошибок на основе contextvars.

0 голосов
/ 05 декабря 2018

Я думаю, что вы можете достичь этого, сбрасывая способы обработки ошибок в конце вашей функции, то есть:

def f():
    err = np.geterr()
    np.seterr(all='raise')
    try:
        # do stuff
    finally:
        np.seterr(**err)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...