我如何检查Python中的NaN?

南(不是一个数字) float('nan')结果。 但是,我该如何检查? 应该很容易,但我找不到它。

math.isnan()

检查float x是否是NaN(不是数字)。 NaN是IEEE 754标准的一部分。 像但不限于inf * 0,inf / inf或涉及NaN的任何操作(例如nan * 1)的操作返回NaN。

2.6版本中的新function

 >>> import math >>> x=float('nan') >>> math.isnan(x) True >>> 

testingNaN的通常方法是看它是否与自己相等:

 def isNaN(num): return num != num 

numpy.isnan(number)告诉你,如果它是NaN或不在Python 2.5中。

我其实只是碰到这个,但对我来说,它是检查nan,-inf或inf。 我刚刚用过

 if float('-inf') < float(num) < float('inf'): 

对于数字来说是这样,对于nan和inf都是错误的,并且会引起像string或其他types的东西的exception(这可能是一件好事)。 这也不需要导入像math或numpy的任何库(numpy是如此的大,它使任何编译的应用程序的大小加倍)。

math.isnan()

或者将数字与自身进行比较。 NaN总是!= NaN,否则(例如,如果它一个数字)比较应该成功。

另一种方法,如果你坚持<2.6,你没有numpy,你没有IEEE 754的支持:

 def isNaN(x): return str(x) == str(1e400*0) 

随着python<2.6我结束了

 def isNaN(x): return str(float(x)).lower() == 'nan' 

这适用于我在Python 5.9上的python 2.5.1和Ubuntu 10上的python 2.6.5

那么我进入这个职位,因为我有一些问题的function:

 math.isnan() 

运行此代码时出现问题:

 a = "hello" math.isnan(a) 

它引起exception。 我的解决scheme是做另一个检查:

 def is_nan(x): return isinstance(x, float) and math.isnan(x) 

这里是一个答案:

  • python 非唯一 NaN: float('nan')
  • numpy 独特的 NaN(singleton): np.nan
  • 任何其他对象:string或任何(如果遇到不会引发exception)

这里是:

 import numpy as np def is_nan(x): return (x is np.nan or x != x) 

还有一些例子:

 values = [float('nan'), np.nan, 55, "string", lambda x : x] for value in values: print "{:<8} : {}".format(repr(value), is_nan(value)) 

输出:

 nan : True nan : True 55 : False 'string' : False <function <lambda> at 0x000000000927BF28> : False 

我从一个networking服务接收数据,将NaN作为string'Nan' 。 但是在我的数据中也可能有其他types的string,所以一个简单的float(value)可能会引发exception。 我使用了接受的答案的以下变种:

 def isnan(value): try: import math return math.isnan(float(value)) except: return False 

需求:

 isnan('hello') == False isnan('NaN') == True isnan(100) == False isnan(float('nan')) = True 

所有告诉variables是NaN还是None的方法:

没有types

 In [1]: from numpy import math In [2]: a = None In [3]: not a Out[3]: True In [4]: len(a or ()) == 0 Out[4]: True In [5]: a == None Out[5]: True In [6]: a is None Out[6]: True In [7]: a != a Out[7]: False In [9]: math.isnan(a) Traceback (most recent call last): File "<ipython-input-9-6d4d8c26d370>", line 1, in <module> math.isnan(a) TypeError: a float is required In [10]: len(a) == 0 Traceback (most recent call last): File "<ipython-input-10-65b72372873e>", line 1, in <module> len(a) == 0 TypeError: object of type 'NoneType' has no len() 

NaN型

 In [11]: b = float('nan') In [12]: b Out[12]: nan In [13]: not b Out[13]: False In [14]: b != b Out[14]: True In [15]: math.isnan(b) Out[15]: True