关于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 相关文章推荐
django1.11.1 models 数据库同步方法
May 30 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
Python Django 前后端分离 API的方法
Aug 28 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
python eventlet绿化和patch原理
Nov 21 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
Python 实现Mac 屏幕截图详解
Oct 05 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对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
php函数与传递参数实例分析
2014/11/15 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
自动更新作用
2006/10/08 Javascript
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
Prototype Class对象学习
2009/07/19 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
深入理解vue Render函数
2017/07/19 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现发送email的几种常用方法
2014/08/18 Python
Python中集合类型(set)学习小结
2015/01/28 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python批量修改ssh密码的实现
2019/08/08 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
python实现四人制扑克牌游戏
2020/04/22 Python
python爬虫容易学吗
2020/06/02 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
Python调用JavaScript代码的方法
2020/10/27 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
应届生骨科医生求职信
2013/10/31 职场文书
奥利奥广告词
2014/03/20 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
党员评议个人总结
2014/10/20 职场文书
MySQL分库分表详情
2021/09/25 MySQL