关于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 translator使用实例
Sep 06 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
Python更新所有已安装包的操作
Feb 13 Python
使用python实现飞机大战游戏
Mar 23 Python
如何在Windows中安装多个python解释器
Jun 16 Python
如何从csv文件构建Tensorflow的数据集
Sep 21 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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编程网上资源导航
2006/10/09 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python创造虚拟环境方法总结
2019/03/04 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
计算机求职信
2013/12/01 职场文书
医学求职自荐信
2014/06/21 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
员工工作能力评语
2014/12/31 职场文书
主持稿开场白
2015/06/01 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android