关于Python中Inf与Nan的判断问题详解

大家都知道 在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。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

时间: 2017-02-06

python中nan与inf转为特定数字方法示例

前言 最近因为工作的需求,要处理两个矩阵的点除,得到结果后,再作其他的计算,发现有些内置的函数不work:查看得到的数据,发现有很多nan和inf,导致Python的基本函数运行不了,这是因为在除的过程中分母出现0的缘故.为了将结果能够被python其他函数处理,尤其numpy库,需要将nan,inf转为python所能识别的类型. 这里将nan,inf替换0作为例子.下面来看看详细的介绍: 1. 代码 import numpy as np a = np.array([[np.nan, np.n

python中调试或排错的五种方法示例

前言 本文主要给大家介绍了关于python中调试或排错的五种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的的介绍吧 python调试或排错的五种方法 1.print,直接打印,比较简单而且粗暴 在代码中直接输入print+需要输出的结果,根据打印的内容判断即可 2.assert断言,很方便,测试人员常常在写自动化用例的时候用的比较多 如下,直接将预期结果和实际结果做判断 def true_code(): x = 3 y = 2 z = x + y assert(5==z), "z

python中@property和property函数常见使用方法示例

本文实例讲述了python中@property和property函数常见使用方法.分享给大家供大家参考,具体如下: 1.基本的@property使用,可以把函数当做属性用 class Person(object): @property def get_name(self): print('我叫xxx') def main(): person = Person() person.get_name if __name__ == '__main__': main() 运行结果: 我叫xxx 2.@pr

python中实现迭代器(iterator)的方法示例

概述 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 延迟计算或惰性求值 (Lazy evaluation) 迭代器不要求你事先准备好整个迭代过程中所有的元素.仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合. 今天创建了一个实体类,大致如下: class Account(): def __init__(self, account_n

python中装饰器级连的使用方法示例

前言 最近在学习python,学会了为什么要使用装饰器,也明白了装饰器是什么了,但是你也许会问,是否可以在装饰器前面再添加一层装饰器,会怎么样呢?就像大楼一样,一层一层地叠在一起.其实是可以的.现在我们就来学习这种堆叠技术,与类的继承是有相似之处,可以不断地继承下去.下面话不多说了,来一起看看详细的介绍吧. 代码如下: #python 3.6 def star(func): def inner(*args, **kwargs): print("*" * 30) func(*args,

python中日期和时间格式化输出的方法小结

本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化日期时间的函数为datetime.datetime.strftime():由字符串转为日期型的函数为:datetime.datetime.strptime(),两个函数都涉及日期时间的格式化字符串,这里提供详细的代码详细演示了每一个参数的使用方法及范例. 下面是格式化日期和时间时可用的替换符号 %a 输出当前是星期几的英文简写 >>> import datetime >&

Python中IP地址处理IPy模块的方法

安装 先下载源码,地址:ps://pypi.python.org/pypi/IPy/">https://pypi.python.org/pypi/IPy/ ,然后解压后使用命令python setup.py install安装. 使用 1.显示IP类型 >>> IP('192.168.1.1').version() 4 >>> IP('::1').version() 6 类似如上所示,通过version方法可以的判断输入的IP是IPv4还是IPv6 .

python中numpy.zeros(np.zeros)的使用方法

翻译: 用法:zeros(shape, dtype=float, order='C') 返回:返回来一个给定形状和类型的用0填充的数组: 参数:shape:形状 dtype:数据类型,可选参数,默认numpy.float64 dtype类型: t ,位域,如t4代表4位 b,布尔值,true or false i,整数,如i8(64位) u,无符号整数,u8(64位) f,浮点数,f8(64位) c,浮点负数, o,对象, s,a,字符串,s24 u,unicode,u24 order:可选参数

python中readline判断文件读取结束的方法

本文实例讲述了python中readline判断文件读取结束的方法.分享给大家供大家参考.具体分析如下: 大家知道,python中按行读取文件可以使用readline函数,下面现介绍一个按行遍历读取文件的方法,通过这个方法,展开我们要讨论的问题: 复制代码 代码如下: filename = raw_input('Enter your file name')  #输入要遍历读取的文件路径及文件名 file = open(filename,'r') done = 0 while not  done:

python中根据字符串调用函数的实现方法

在python中可以根据字符串来调用函数: 1.使用getattr从字符串来调用函数 在多进程中,可能传递过来的是一个字符串,那么我怎么来调用一个已经存在的函数呢,主要就是使用到getattr函数的作用,这个函数就是在使用字符串得到这个字符串对应的函数的对象,然后就可以进行执行,如下所示: 在模块中,存在两个函数: [root@python 530]# cat attr.py #!/usr/bin/env python def kel(): print 'this is a kel functi