关于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实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
Python如何读取MySQL数据库表数据
Mar 11 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
解决echarts中饼图标签重叠的问题
May 16 Python
django 模型中的计算字段实例
May 19 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
聊一聊python常用的编程模块
May 14 Python
如何用Python搭建gRPC服务
Jun 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
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php查看当前Session的ID实例
2015/03/16 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
浅析Python函数式编程
2018/10/06 Python
python看某个模块的版本方法
2018/10/16 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
Python bisect模块原理及常见实例
2020/06/17 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
证婚人经典证婚词
2014/01/09 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
项目工作说明书
2014/07/29 职场文书
119消防日活动总结
2014/08/29 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技