关于Python中Inf与Nan的判断问题详解
作者:Huoty 发布时间:2021-10-31 18:56:33
大家都知道 在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。
总结


猜你喜欢
- MySQL中concat函数 使用方法:CONCAT(str1,str2,…)返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,
- 一、概述Python Flask是一个轻量级的Web应用程序框架,它是使用Python编写的,用于快速开发Web应用程序和API。它的设计理
- 本文实例讲述了Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能。分享给大家供大家参考,具体如下:因为需要使用
- 问题描述前端 vue 框架,后台 php,百度跨域问题后台加这段代码header("Access-Control-Allow-Or
- 本文实例讲述了mysql代码执行结构。分享给大家供大家参考,具体如下:本文内容:什么是代码执行结构顺序结构分支结构循环结构 首发日
- Function content_Code(Str) dim ary_String,i,n,n_pos&nbs
- 相信大家使用MySQL都有过重装的经历,要是重装MySQL基本都是在最后一步通不过,除非重装操作系统,究其原因就是系统里的注册表没有删除干净
- python操纵mysql数据库,向一个表中插入一条新的记录。pycahrm提供一个很好的功能,在右边上面,可以连接数据库,并在里面手动操作
- 代码如下:<% sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOP
- 组件值校验,即在组件值变化时判断是否满足校验逻辑,若不满足校验逻辑,可以拿到校验错误信息进行错误提示或其他逻辑处理。声明 valueVali
- 是时候稍微总结一下前一段时间的PHP简单系统制作技巧了。 前一段时间主要讲述了如何用PHP读取与查询MySQL中的数据,并向大家着重解释了如
- Tags# 普通for循环<ul>{% for user in user_list %} <li>{{
- 概述:可以将.py源代码转换成无需源代码的可执行文件(直接就可以运行的程序)因为有的时候Windows,Mac,Linux系统上并没有安装P
- 通过第三方BeautifulSoup库来爬取op.gg网页静态数据主要思路op.gg网站网站以出场率高低排名,并且列出对位胜率,在高出场率的
- 情景一:不需要原有的数据库数据删除数据库所有的表删除项目的migration模块中的所有 文件,除了__init__.py 文件执行脚本py
- 先来看一道题目:>>> def func(numbers=[], num=1):... numbers.append(nu
- 下面给大家介绍python实现简易版的web服务器,具体内容详情大家通过本文学习吧!1、请自行了解HTTP协议https://www.jb5
- 1.怎么样查看数据库字符集 [A]数据库服务器字符集select * from nls_database_parameters,其来源于pr
- 点击按钮,出现半透明遮罩层弹框,说说自己之前发过的愁吧1、遮罩层半透明了 弹框也跟着半透明了 就像这样 绝望吧 是哪里错了呢?你的
- xlwt与xlrd只能针对xls格式的excel进行操作,如果想对xlsx格式进行操作请使用openpyxl模板对excel进行操作xlwt