仅更改函数内的np.seterr行为

时间:2018-12-05 14:51:41

标签: python numpy

我想在单个函数内更改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 :(得分:3)

使用numpy.errstate上下文管理器临时更改浮点错误处理:

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

请注意,尽管这是一个临时更改,但在线程和协程中仍然是全局的。在撰写本文时,NumPy还没有提供针对线程本地或基于contextvars的错误设置的选项。

答案 1 :(得分:1)

我认为您可以通过在函数结束时重置错误的处理方式来实现此目标,即:

def f():
    err = np.geterr()
    np.seterr(all='raise')
    try:
        # do stuff
    finally:
        np.seterr(**err)