关于Python中Inf与Nan的判断问题详解


Posted in Python onFebruary 08, 2017

大家都知道 在Python 中可以用如下方式表示正负无穷:

float("inf") # 正无穷
float("-inf") # 负无穷

利用 inf(infinite) 乘以 0 会得到 not-a-number(NaN) 。如果一个数超出 infinite,那就是一个 NaN(not a number)数。在 NaN 数中,它的 exponent 部分为可表达的最大值,即 FF(单精度)、7FF(双精度)和 7FFF(扩展双精度)。 NaN 数与 infinite 数的区别是:infinite 数的 significand 部分为 0 值(扩展双精度的 bit63 位为 1);而 NaN 数的 significand 部分不为 0 值。

我们先看看如下的代码:

>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan")
False

如果你没有尝试过在 Python 中判断一个浮点数是否为 NaN,对以上的输出结果肯定会感到诧异。首先,对于正负无穷和 NaN 自身与自身用 is 操作,结果都是 True,这里好像没有什么问题;但是如果用 == 操作,结果却不一样了, NaN 这时变成了 False。如果分别用 float 重新定义一个变量来与它们再用 is 和 == 比较,结果仍然出人意料。出现这种情况的原因稍稍有些复杂,这里就不赘术了,感兴趣可以查阅相关资料。

如果你希望正确的判断 Inf 和 Nan 值,那么你应该使用 math 模块的 math.isinf math.isnan 函数:

>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True

这样便准确无误了。既然我在谈论这个问题,就是再忠告:不要在 Python 中试图用 is 和 == 来判断一个对象是否是正负无穷或者 NaN。你就乖乖的用 math 模块吧,否则就是引火烧身。

当然也有别的方法来作判断,以下用 NaN 来举例,但仍然推荐用 math 模块,免得把自己弄糊涂。

用对象自身判断自己

>>> def isnan(num):
...  return num != num
... 
>>> isnan(float("nan"))
True

用 numpy 模块的函数

>>> import numpy as np
>>> 
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False

Numpy 的 isnan 函数还可以对整个 list 进行判断:

>>> lst = [1, float("nan"), 2, 3, np.nan, float("-inf"), 4, np.nan]
>>> lst
[1, nan, 2, 3, nan, -inf, 4, nan]
>>> np.isnan(lst)
array([False, True, False, False, True, False, False, True], dtype=bool)

这里的 np.isnan 返回布尔值数组,如果对应位置为 NaN,返回 True,否则返回 False。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python中urllib2模块的8个使用细节分享
Jan 01 Python
python通过定义一个类实例作为ftp回调方法
May 04 Python
Python中查看文件名和文件路径
Mar 31 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
Jun 11 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
Python实现带下标索引的遍历操作示例
May 30 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
基于python实现音乐播放器代码实例
Jul 01 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
python中filter,map,reduce的作用
Jun 10 Python
python3.5实现socket通讯示例(TCP)
Feb 07 #Python
Python中字典的setdefault()方法教程
Feb 07 #Python
Python连接数据库学习之DB-API详解
Feb 07 #Python
使用Python中的tkinter模块作图的方法
Feb 07 #Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 #Python
详解python中字典的循环遍历的两种方式
Feb 07 #Python
python3使用PyMysql连接mysql数据库实例
Feb 07 #Python
You might like
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
Vue实现简单分页器
2018/12/29 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
pandas中Timestamp类用法详解
2017/12/11 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
python实现PCA降维的示例详解
2020/02/24 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
最热门的自我评价
2013/12/30 职场文书
留学推荐信怎么写
2014/01/25 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
2014财务年度工作总结
2014/11/11 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书