关于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中元类用法实例
Oct 10 Python
python win32 简单操作方法
May 25 Python
Python内置模块logging用法实例分析
Feb 12 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
Python爬取成语接龙类网站
Oct 19 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
Python list运算操作代码实例解析
Jan 20 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
浅析Python的命名空间与作用域
Nov 25 Python
OpenCV灰度化之后图片为绿色的解决
Dec 01 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数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
python编写简单爬虫资料汇总
2016/03/22 Python
python中的闭包函数
2018/02/09 Python
python检测IP地址变化并触发事件
2018/12/26 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
如何解决安装python3.6.1失败
2020/07/01 Python
Python实现弹球小游戏
2020/08/01 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
美国在线印刷公司:PsPrint
2017/10/12 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
小区门卫值班制度
2014/01/24 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
餐厅筹备计划书
2014/04/25 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
爱情保证书
2015/01/17 职场文书
个人先进事迹总结
2015/02/26 职场文书
Apache POI的基本使用详解
2021/11/07 Servers