大家都知道 在Python 中可以用如下方式表示正负无穷:

1

2

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 值。

我们先看看如下的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

>>> 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 函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

>>> 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 模块,免得把自己弄糊涂。

用对象自身判断自己

1

2

3

4

5

>>> def isnan(num):

...  return num != num

...

>>> isnan(float("nan"))

True

用 numpy 模块的函数

1

2

3

4

5

6

7

8

>>> import numpy as np

>>>

>>> np.isnan(np.nan)

True

>>> np.isnan(float("nan"))

True

>>> np.isnan(float("inf"))

False

Numpy 的 isnan 函数还可以对整个 list 进行判断:

1

2

3

4

5

>>> 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中Inf与Nan的判断问题详解相关推荐

  1. python判断nan格式_关于Python中Inf与Nan的判断问题详解

    大家都知道 在Python 中可以用如下方式表示正负无穷: float("inf") # 正无穷 float("-inf") # 负无穷 利用 inf(infi ...

  2. matlab 判断是否是nan,关于Python中Inf与Nan的判断问题详解

    python中运行错误,关于聚类算法出现的nan值问题处理的数据有10个属性,使用kmeans聚类算法出现了nan值的错误,请问怎么说明你的样本数据中有nan值,通常是因为原始数据中包含空字符串或No ...

  3. python中if语句的实例_对python中if语句的真假判断实例详解

    说明 在python中,if作为条件语句,当if后面的条件参数为真时,则执行后面的语句块,反之跳过,为了深入理解if语句,我们需要知道if语句的真假判断方式. 示例 在python交互器中,经过测试发 ...

  4. Python中的list/tuple/dict/set数据类型详解

    Python中的list/tuple/dict/set数据类型详解 Python内部内置了一些数据类型与结构,可以方便在编程时候的使用. list List存储一系列的有序集合,并且元素内容可变(可更 ...

  5. python中append函数解析_对python中的pop函数和append函数详解

    对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...

  6. 站长在线Python精讲:在Python中匹配字符串的3个方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中匹配字符串的3个方法详解>.本知识点主要内容有:使用match()方法进行匹配.使用search()方法进行 ...

  7. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  8. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  9. Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略

    Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介.案例应用(python中的编码格式及常见编码问题详解)之详细攻略 目录 符串编码(ASCII编码/GB ...

最新文章

  1. 中国地理区域IP库整理
  2. 关于Matlab中符号运算的因式分解、展开与合并
  3. SpringMVC处理模型数据
  4. 110余家企业聚集智博会 专家表示智慧城市需以打破数据堡垒为前提
  5. 标题栏上显示页面上的鼠标坐标
  6. 解决 error: Your local changes to the following files would be overwritten by merge:XXXX
  7. Git教程之一个团队如何在github上协作开发
  8. c语言冒泡排序的两种实现方式,c语言中冒泡排序的实现原理是什么?
  9. hdu 1209 clocks wrong answer 我的错误代码(没审好题唉,角度一样后,还要按小时排序。...
  10. Gröbner基方法入门第II部分:Gröbner基和Buchberger算法
  11. 基于DAC8563模块的低速模拟振镜驱动,实现直线插补,点到点划线
  12. 随机过程之基本概念(一)
  13. 51Nod-1859-Clarke and number
  14. 利用Python将多张图像合成视频
  15. 计算机每次网络重插才能启动,为何电脑开机后再插网线才能用_每次开机都要重插网线的解决方法...
  16. 十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)
  17. 人工智能与信息社会 超星学习通 网课 题库 大全 最全 中国大学 MOOC 北京大学 考试 题目 答案
  18. 2017搜狗AI技术开放日
  19. 微服务跨数据库联合查询_微服务架构下,解决数据库跨库查询的一些思路
  20. LBF特征和增强的LBF特征。

热门文章

  1. java 实现快速排序
  2. 40x60x100相当于多少寸的行李箱
  3. Windows10系统快捷键创建一个新的虚拟桌面
  4. printf函数详解
  5. 日志收集工具 Fluentd 使用教程
  6. 微信公众号H5开发登录授权流程
  7. electron 关闭窗口提示框 关闭确认 关闭弹窗 提示窗
  8. c语言实型常量除以整形常量,c语言中的整型常量和实型常量.docx
  9. 编程界的变革者:Brendan Eich
  10. 一文教会你Python 随机爬山算法