关于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按照多个字符对字符串进行分割的方法
Mar 17 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
Python有参函数使用代码实例
Jan 06 Python
Python enumerate内置库用法解析
Feb 24 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Python实现播放和录制声音的功能
Aug 12 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
JS继承--原型链继承和类式继承
2013/04/08 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
package.json文件配置详解
2017/06/15 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
文员岗位职责范本
2014/03/08 职场文书
初中班主任评语
2014/04/24 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python
Redis分布式锁Redlock的实现
2021/08/07 Redis
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android