关于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脚本将Bing的每日图片作为桌面的教程
May 04 Python
python抓取文件夹的所有文件
Feb 27 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
详解Python 解压缩文件
Apr 09 Python
Python安装Flask环境及简单应用示例
May 03 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
快速查找Python安装路径方法
Feb 06 Python
浅谈Python响应式类库RxPy
Jun 14 Python
python四种出行路线规划的实现
Jun 23 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
python脚本框架webpy模板赋值实现
Nov 20 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 cc攻击代码与防范方法
2012/10/18 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
three.js 入门案例详解
2018/01/23 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
vue仿element实现分页器效果
2018/09/13 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
Python多进程编程技术实例分析
2014/09/16 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python编写打字训练小程序
2019/09/26 Python
QML用PathView实现轮播图
2020/06/03 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
工作的心得体会
2013/12/31 职场文书
旷课检讨书3000字
2014/02/04 职场文书
董事长助理工作职责
2014/06/08 职场文书
委托书的写法
2014/09/16 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
商务代表岗位职责
2015/02/15 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
详解Vue的sync修饰符
2021/05/15 Vue.js
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技