浮点数错误处理#
错误处理设置存储在 contextvars 中,允许不同的线程或异步任务拥有独立的配置。更多信息,请参阅 线程安全。
NumPy 如何处理数值异常#
默认情况下,对于 invalid、divide 和 overflow,设置为 '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])
设置和获取错误处理#
|
设置浮点数错误的处理方式。 |
|
获取当前浮点数错误的处理方式。 |
|
设置浮点数错误的回调函数或日志对象。 |
返回当前在浮点数错误时使用的回调函数。 |
|
|
浮点数错误处理的上下文管理器。 |