在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存储在诸如list
或dict
(或使用自定义容器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