116

大多数语言都有一个 NaN 常量,您可以使用它来为变量分配值 NaN。python可以在不使用numpy的情况下做到这一点吗?

4

6 回答 6

191

是的 - 使用math.nan.

>>> from math import nan
>>> print(nan)
nan
>>> print(nan + 2)
nan
>>> nan == nan
False
>>> import math
>>> math.isnan(nan)
True

在 Python 3.5 之前,可以使用float("nan")(不区分大小写)。

请注意,检查是否为 NaN 的两个事物是否彼此相等将始终返回 false。这部分是因为“不是数字”的两件事不能(严格来说)说彼此相等——请参阅所有比较返回 false 的 IEEE754 NaN 值的基本原理是什么?了解更多详情和信息。

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

==此外,在尝试将 NaN 存储在容器类型(例如listordict或使用自定义容器类型时)中时,对 NaN 值的操作的确切语义可能会导致微妙的问题。有关更多详细信息,请参阅检查容器中是否存在 NaN


您还可以使用 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 的分数模块中构造 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')orFraction(float('inf'))是不允许的,并且会抛出异常,就像 NaN 一样。

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


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

于 2013-10-15T06:05:27.823 回答
22
nan = float('nan')

现在你有了常数,nan.

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

dnan = Decimal('nan')
于 2013-10-15T06:05:56.370 回答
10

使用float("nan")

>>> float("nan")
nan
于 2013-10-15T06:05:20.590 回答
9

可以从“inf - inf”得到NaN,也可以从大于2e308的数得到“inf”,所以,我一般用:

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan
于 2016-01-13T20:05:48.927 回答
7

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

于 2013-10-15T06:05:34.997 回答
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)
于 2016-01-21T22:02:08.367 回答