大多数语言都有一个NaN常量,可用于为变量赋值NaN。 python可以不使用numpy吗?
答案 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
模块类似的一组函数和常量:
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'))
)答案 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)