在python中分配一个variablesNaN,而不是numpy

大多数语言都有一个NaN常量,您可以使用它来为variables赋值NaN。 python可以做到这一点,而不使用numpy?

是的 – 使用float('nan') 。 从Python 3.5开始,你也可以使用math.nan

 >>> a = float('nan') >>> print(a) nan >>> print(a + 2) nan >>> a == a False >>> import math >>> math.isnan(a) True >>> # Python 3.5+ >>> math.isnan(math.nan) True 

float(...)函数是不区分大小写的 – 执行float('NAN')或者float('naN')或者类似的东西也会起作用。

注意检查两个NaN是否相等,总会返回false。 这部分是因为两个“不是数字”的东西不能说(严格地说)是相互等同的 – 请看所有比较结果对IEEE754 NaN值返回错误的理由是什么? 了解更多细节和信息。

相反,如果您需要确定一个值是否为NaN,请使用math.isnan(...)

此外,当试图将NaN存储在诸如listdict (或使用自定义容器types)的容器types内时,NaN值上的==操作的确切语义可能会引起细微的问题。 有关更多详细信息,请参阅检查容器中是否存在NaN 。


您也可以使用Python的十进制模块构造NaN数字:

 >>> from decimal import Decimal >>> b = Decimal('nan') >>> print(b) NaN >>> print(repr(b)) Decimal('NaN') >>> >>> Decimal(float('nan')) Decimal('NaN') >>> >>> import math >>> math.isnan(b) True 

math.isnan(...)也将使用十进制对象。


但是,您不能在Python的分数模块中构buildNaN数字:

 >>> from fractions import Fraction >>> Fraction('nan') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python35\lib\fractions.py", line 146, in __new__ numerator) ValueError: Invalid literal for Fraction: 'nan' >>> >>> Fraction(float('nan')) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python35\lib\fractions.py", line 130, in __new__ value = Fraction.from_float(numerator) File "C:\Python35\lib\fractions.py", line 214, in from_float raise ValueError("Cannot convert %r to %s." % (f, cls.__name__)) ValueError: Cannot convert nan to Fraction. 

顺便说一句,你也可以做float('Inf')Decimal('Inf')math.inf (3.5+)来分配无限数字。 (另请参阅math.isinf(...)

但是不允许使用Fraction('Inf')Fraction(float('inf')) ,就像NaN一样抛出exception。

如果你想要一个快速简单的方法来检查一个数字既不是NaN也不是无限的,你可以使用Python 3.2+以上的math.isfinite(...)


如果要使用复数进行类似的检查, cmath模块包含与math模块类似的一组函数和常量:

  • cmath.isnan(...)
  • cmath.isinf(...)
  • cmath.isfinite(...) (Python 3.2+)
  • cmath.nan (Python 3.6+;等同于complex(float('nan'), 0.0)
  • cmath.nanj (Python 3.6+;相当于complex(0.0, float('nan'))
  • cmath.inf (Python 3.6+;相当于complex(float('inf'), 0.0)
  • cmath.infj (Python 3.6+;相当于complex(0.0, float('inf'))
 nan = float('nan') 

现在你有恒定的, nan

您可以类似地创build十进制的NaN值。

 dnan = Decimal('nan') 

使用float("nan")

 >>> float("nan") nan 

你可以做float('nan')来获得NaN。

生成inf和-inf的更一致(更不透明)的方法是再次使用float():

 >> positive_inf = float('inf') >> positive_inf inf >> negative_inf = float('-inf') >> negative_inf -inf 

请注意,浮点数的大小取决于体系结构,所以最好避免使用像9e999这样的幻数,即使这很可能工作。

 import sys sys.float_info sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) 

你可以从“inf-inf”得到NaN,你可以从大于2e308的数字中得到“inf”,所以我通常使用:

 >>> inf = 9e999 >>> inf inf >>> inf - inf nan