关于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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
在Python的Django框架中更新数据库数据的方法
Jul 17 Python
总结Python编程中函数的使用要点
Mar 20 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
Django的分页器实例(paginator)
Dec 01 Python
Python登录注册验证功能实现
Jun 18 Python
彻底理解Python中的yield关键字
Apr 01 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
python获取淘宝服务器时间的代码示例
Apr 22 Python
Python 批量下载阴阳师网站壁纸
May 19 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
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
PHP中的float类型使用说明
2010/07/27 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
php实现简单的上传进度条
2015/11/17 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Selenium定位元素操作示例
2018/08/10 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
python输入错误后删除的方法
2019/10/12 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
英国日常交易网站:Wowcher
2018/09/04 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
技校教师求职简历的自我评价
2013/10/20 职场文书
营业员演讲稿
2013/12/30 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS