关于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 相关文章推荐
Python2随机数列生成器简单实例
Sep 04 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
python中partial()基础用法说明
Dec 30 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
Python实现快速排序的方法详解
Oct 25 Python
keras.layer.input()用法说明
Jun 16 Python
python实现代码审查自动回复消息
Feb 01 Python
编写python程序的90条建议
Apr 14 Python
Python torch.flatten()函数案例详解
Aug 30 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
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
js创建对象的方式总结
2015/01/10 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
python模块之paramiko实例代码
2018/01/31 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
Python列表与元组的异同详解
2019/07/02 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
Python tornado上传文件的功能
2020/03/26 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
django 外键创建注意事项说明
2020/05/20 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
刊首寄语大全
2014/04/11 职场文书
大学生求职信怎么写
2015/03/19 职场文书