仅在函数内部更改np.senter行为



我想更改单个函数内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()的输出,我不知道如何做到这一点。

谢谢你的帮助!

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

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

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

从NumPy 1.17开始,也可以使用numpy.errstate作为函数装饰器,其效果与将整个主体包裹在with numpy.errstate(...):块中相同:

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

我认为您可以通过重置函数末尾处理错误的方式来实现这一点,即:

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

最新更新