这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
Numpy浮点错误处理:
主要有以下几个方法进行设置
- seterr: 设置如何处理浮点错误
seterr(all=None, divide=None, over=None, under=None, invalid=None)
处理方式有以下5个值:
‘ignore’: 忽略错误,不做任何输出和处理
‘warn’: 打印RuntimeWarning警告信息
‘raise’: 抛出FloatingPointError错误信息
‘call’: 调用seterrcall设置的函数进行处理
‘print’: 把警告直接打印到标准输出设备
‘log’: 调用seterrcall设置的函数进行处理
divide: 发生除零错误时的处理方式
over:发生数据溢出错误时的处理方式
under:发生数据比浮点数还小错误时的处理方式
invalid:发生数据为非浮点数时的处理方式
In [1]: 2**16
Out[1]: 65536
In [3]: import numpy as np
In [4]: 40000*3
Out[4]: 120000
In [5]: 40000*3 > 2**16
Out[5]: True
下面的例子会发生溢出,Numpy的错误级别是warn
In [6]: np.int16(40000) * np.int16(3)
/Users/vichen/.pyenv/versions/3.6.8/bin/ipython:1: RuntimeWarning: overflow encountered in short_scalars
Out[6]: -11072
修改数据溢出时的错误处理为抛出错误
In [7]: np.seterr(all='print', over='raise')
Out[7]: {'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}
修改数据溢出时的错误处理为抛出错误后产生以下的错误信息
In [8]: np.int16(40000) * np.int16(3)
FloatingPointError Traceback (most recent call last)
in
----> 1 np.int16(40000) * np.int16(3)
FloatingPointError: overflow encountered in short_scalars
修改数据溢出时的错误处理为忽略错误
In [9]: np.seterr(all='print', over='ignore')
Out[9]: {'divide': 'print', 'over': 'raise', 'under': 'print', 'invalid': 'print'}
修改数据溢出时的错误处理为忽略错误后溢出没有提示任何信息
In [10]: np.int16(40000) * np.int16(3)
Out[10]: -11072
- geterr:获取当前错误处理的设置信息
In [11]: np.geterr()
Out[11]: {'divide': 'print', 'over': 'ignore', 'under': 'print', 'invalid': 'print'}
- seterrcall:配置发生错误时的错误处理函数
In [13]: def error_handler(type, flag):
...: print("error: {}, flag: {}".format(type, flag))
...:
In [14]: np.seterrcall(error_handler)
In [15]: np.geterrcall()
Out[15]: <function main.error_handler(type, flag)>
In [16]: np.seterr(all='call')
Out[16]: {'divide': 'print', 'over': 'ignore', 'under': 'print', 'invalid': 'print'}
In [17]: np.int16(40000) * np.int16(3)
error: overflow, flag: 2
Out[17]: -11072
- geterrcall: 获取错误处理时的函数信息
In [13]: def error_handler(type, flag):
...: print("error: {}, flag: {}".format(type, flag))
...:
In [14]: np.seterrcall(error_handler)
In [15]: np.geterrcall()
Out[15]: <function main.error_handler(type, flag)>