关于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 15 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python标记语句块使用方法总结
Aug 05 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
opencv python在视屏上截图功能的实现
Mar 05 Python
Python线程协作threading.Condition实现过程解析
Mar 12 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
python基于爬虫+django,打造个性化API接口
Jan 21 Python
python中time.ctime()实例用法
Feb 03 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
PHP5函数小全(分享)
2013/06/06 PHP
smarty中js的调用方法示例
2014/10/27 PHP
php自定义时间转换函数示例
2016/12/07 PHP
php中yii框架实例用法
2020/12/22 PHP
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
机械设计专业应届生求职信
2013/11/21 职场文书
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
校三好学生主要事迹
2014/01/11 职场文书
临床医师个人自我评价
2014/04/06 职场文书
社区党建工作方案
2014/06/10 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
介绍信范文大全
2015/05/07 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js