Python中的inf与nan
Python中可以用如下方式表示正负无穷
>>> float('inf') # 正无穷,inf不区分大小写,float('InF')一样可以。
inf
>>> float('-inf') # 负无穷,不区分大小写。
-inf
当涉及 > 和 < 运算时, 所有数都比 -inf 大 ,所有数都比 +inf 小。
>>> float('nan')
nan
nan代表Not A Number(不是一个数),它并不等于0,因为nan不是一个数,所以相关计算都无法得到数字。
正无穷float('inf')
>>> float('inf') + 100
inf
>>> float('inf') - 100
inf
>>> float('inf') * 100
inf
>>> float('inf') / 100
inf
>>> float('inf') + float('inf')
inf
>>> float('inf') - float('inf')
nan
>>> float('inf') * float('inf')
inf
>>> float('inf') / float('inf')
nan
>>> 100 + float('inf')
inf
>>> 100 - float('inf')
-inf
>>> 100 * float('inf')
inf
>>> 100 / float('inf')
0.0
负无穷float('inf')
>>> float('-inf') + 100
-inf
>>> float('-inf') - 100
-inf
>>> float('-inf') * 100
-inf
>>> float('-inf') / 100
-inf
>>> float('-inf') + float('-inf')
-inf
>>> float('-inf') - float('-inf')
nan
>>> float('-inf') * float('-inf')
inf
>>> float('-inf') / float('-inf')
nan
>>> 100 + float('-inf')
-inf
>>> 100 - float('-inf')
inf
>>> 100 * float('-inf')
-inf
>>> 100 / float('-inf')
-0.0
可见,正无穷float('inf')与负无穷float('inf')运算有着异曲同工之妙。
正无穷float('inf')与负无穷float('inf')之间的运算:
>>> float('inf') + float('-inf')
nan
>>> float('inf') - float('-inf')
inf
>>> float('-inf') - float('inf')
-inf
>>> float('inf') * float('-inf')
-inf
>>> float('inf') / float('-inf')
nan
>>> float('-inf') / float('inf')
nan
NaN
所有涉及nan的操作,返回的都是nan。
>>> float('nan') + 100
nan
>>> float('nan') - 100
nan
>>> float('nan') * 100
nan
>>> float('nan') / 100
nan
比较操作时,返回的都是False,哪怕两个float('nan')互相比较都不相等。
>>> float('nan') > float('inf')
False
>>> float('nan') > float('-inf')
False
>>> float('nan') < float('inf')
False
>>> float('nan') < float('-inf')
False
>>> float('nan') == float('nan') # 注意
False
Python中可以用math.isinf()与math.isnan()来判断数据是否为inf或nan。
>>> import math
>>> math.isinf(float('inf'))
True
>>> math.isinf(float('-inf'))
True
>>> math.isnan(float('nan'))
True
除此之外,还有别的方法可以用来判断数据是否为inf和nan,但上述方法是最推荐的,所以其他方法不再赘述。
正负无穷与NaN的is和==判断
>>> 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
首先,对于正负无穷和 NaN 自身与自身用 is 操作,结果都是 True,这里好像没有什么问题;但是如果用 == 操作,结果却不一样了, NaN 这时变成了 False。如果分别用 float 重新定义一个变量来与它们再用 is 和 == 比较,结果仍然出人意料。出现这种情况的原因稍稍有些复杂,这里就不赘术了,感兴趣可以查阅相关资料。
既然我在谈论这个问题,就再忠告:不要在 Python 中试图用 is 和 == 来判断一个对象是否是正负无穷或者 NaN。乖乖的用 math 模块就OK了,否则就是引火烧身。
Python中的inf与nan的更多相关文章
- Python中识别DataFrame中的nan
# 识别python中DataFrame中的nanfor i in pfsj.index: if type(pfsj.loc[i]['WZML']) == float: print('float va ...
- 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况
一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...
- 【转】python 历险记(四)— python 中常用的 json 操作
[转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...
- python 历险记(四)— python 中常用的 json 操作
目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...
- Python中的矩阵、多维数组:Numpy
Numpy 是Python中科学计算的核心库.它提供一个高性能多维数据对象,以及操作这个对象的工具.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对 ...
- python中的函数---函数应用
每种编程语言中,都需要函数的参与,python同样也不例外.函数是集成的子程序,是算法实现的最小方法单位,是完成基本操作的手段的集合.编程中能够灵活应用函数,提高程序设计的简单化:实现代码应用的复用化 ...
- python 数字系列-无穷大与NaN
无穷大与NaN 问题 你想创建或测试正无穷.负无穷或NaN(非数字)的浮点数. 解决方案 Python并没有特殊的语法来表示这些特殊的浮点值,但是可以使用 float() 来创建它们.比如: > ...
- Python中的内置函数
2.1 Built-in Functions The Python interpreter has a number of functions built into it that are alway ...
- Python中pandas模块解析
Pandas基于两种数据类型: series 与 dataframe . 1.Series 一个series是一个一维的数据类型,其中每一个元素都有一个标签.类似于Numpy中元素带标签的数组.其中, ...
随机推荐
- Storm 学习之路(三)—— Storm单机版本环境搭建
1. 安装环境要求 you need to install Storm’s dependencies on Nimbus and the worker machines. These are: Jav ...
- 系统学习 Java IO (三)----文件类 File
目录:系统学习 Java IO---- 目录,概览 Java IO API 中的 File 类可以访问基础文件系统. 使用 File 类,可以: 检查文件或目录是否存在. 如果目录不存在,创建一个目录 ...
- 关于Jvm类加载机制,这一篇就够了
前言 一个月没更新了,这个月发生了太多的事情,导致更新的频率大大降低,不管怎样收拾心情,技术的研究不能落下! jvm作为每个java程序猿必须了解的知识,博主推荐一本书<深入理解Java虚拟机& ...
- MapReduce in MongoDB
MongoDB の MapReduce 在Hadoop的学习中已经接触过MapReduce了,它是一个很成熟的计算模型,将大批量的工作(也就是数据)分解(MAP映射)执行,最后将结果合并成最终的Red ...
- JAVA 从一个List里删除包含另一个List的数据
/** * 从listA里删除listB里有的数据 * @param listA * @param listB * @return */ public static List<String> ...
- 让Redis突破内存大小的限制
Redis虽然可以实现持久化存储,也是基于数据内存模型的基础之上,单机内存大小限制着Redis存储的数据量,有没有一种替代方案呢?本文介绍一款笔者使用的采用New BSD License 许可协议的软 ...
- 常见Code Review过程中发现的问题-续
上一篇列举了一些比较常见的Code Review问题列表,文末有链接,可追溯查看.本篇为上篇的姊妹篇,继续列举一些上篇遗漏的或不易发现的问题清单,希望能整体性把一些常见的问题表述出来. 测试数据不具有 ...
- bzoj1854 游戏题解(二分图/并查集)
1854: [Scoi2010]游戏 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5547 Solved: 2229[Submit][Status] ...
- centos7 添加用户,组
centos7添加用户,组. groupadd projectUsers //添加组,组名projectUser. cat /etc/group //查看最后一行是projectUser. 添加用户并 ...
- spark 源码分析之十六 -- Spark内存存储剖析
上篇spark 源码分析之十五 -- Spark内存管理剖析 讲解了Spark的内存管理机制,主要是MemoryManager的内容.跟Spark的内存管理机制最密切相关的就是内存存储,本篇文章主要介 ...