在python中分配变量NaN而不是numpy

时间:2013-10-15 06:02:06

标签: python constants nan

大多数语言都有一个NaN常量,可用于为变量赋值NaN。 python可以不使用numpy吗?

6 个答案:

答案 0 :(得分:130)

是 - 使用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。这部分是因为有两件事是"而不是数字" (严格地说)不能说是彼此相等的 - 请参阅What is the rationale for all comparisons returning false for IEEE754 NaN values?了解更多详情和信息。

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

此外,尝试将NaN存储在容器类型(如==list内时(或使用自定义容器时),NaN值dict操作的确切语义可能会导致细微问题类型)。有关详细信息,请参阅Checking for NaN presence in a container


您还可以使用Python的decimal模块构建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(...)也适用于Decimal对象。


但是,你不能在Python的fractions模块中构建NaN号码:

>>> 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一样。

如果您想快速简便地检查某个数字是否既不是NaN也不是无限,那么您可以在Python 3.2 +中使用math.isfinite(...)


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

答案 1 :(得分:13)

nan = float('nan')

现在你有了常数nan

您可以类似地为decimal.Decimal创建NaN值。:

dnan = Decimal('nan')

答案 2 :(得分:6)

使用float("nan")

>>> float("nan")
nan

答案 3 :(得分:5)

您可以float('nan')获取NaN。

答案 4 :(得分:3)

你可以从&#34; inf-inf&#34;获得NaN,你可以获得&#34; inf&#34;从大于2e308的数字,所以,我通常使用:

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

答案 5 :(得分:0)

生成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)