关于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实现进程间通信简单实例
Jul 23 Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 Python
低版本中Python除法运算小技巧
Apr 05 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
Python3 操作符重载方法示例
Nov 23 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
Python实现k-means算法
Feb 23 Python
Python入门学习指南分享
Apr 11 Python
python实现简单井字棋小游戏
Mar 05 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
vue.js刷新当前页面的实例讲解
Dec 29 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引用(&)各种使用方法实例详解
2014/03/20 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
Redux实现组合计数器的示例代码
2018/07/04 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
复制粘贴功能的Python程序
2008/04/04 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
在校生党员自我评价
2013/09/25 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
师范生求职自荐信
2014/06/14 职场文书
商务经理岗位职责
2014/07/30 职场文书
趵突泉导游词
2015/02/03 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android