浮点数错误处理#

错误处理设置存储在 contextvars 中,允许不同的线程或异步任务拥有独立的配置。更多信息,请参阅 线程安全

NumPy 如何处理数值异常#

默认情况下,对于 invaliddivideoverflow,设置为 'warn';对于 underflow,设置为 'ignore'。但这可以被更改,并且可以为不同类型的异常单独设置。不同的行为是:

  • 'ignore' : 异常发生时,不执行任何操作。

  • 'warn' : (通过 Python 的 warnings 模块)打印一个 RuntimeWarning

  • '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
<python-input-1>: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 "<python-input-1>", line 2, in <module>
    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)

浮点数错误处理的上下文管理器。