关于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 相关文章推荐
Django框架中方法的访问和查找
Jul 15 Python
Python使用PDFMiner解析PDF代码实例
Mar 27 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
python 接口返回的json字符串实例
Mar 27 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
详解python做UI界面的方法
Feb 27 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 13 Python
python matplotlib绘制三维图的示例
Sep 24 Python
Django自定义YamlField实现过程解析
Nov 11 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编程之高级技巧——利用Mysql函数
2006/10/09 PHP
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
php中变量及部分适用方法
2008/03/27 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
python二叉树的实现实例
2013/11/21 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
Python标准库shutil用法实例详解
2018/08/13 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
求职简历中自我评价
2014/01/28 职场文书
出纳员岗位职责
2014/03/13 职场文书
护理专业自荐书
2014/06/04 职场文书
求职教师自荐书
2014/06/19 职场文书
销售经理岗位职责
2015/01/31 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS