簡體   English   中英

在沒有numpy的情況下在python中分配變量NaN

[英]Assigning a variable NaN in python without numpy

大多數語言都有一個 NaN 常量,您可以使用它為變量分配值 NaN。 python可以在不使用numpy的情況下做到這一點嗎?

是的 - 使用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。 這部分是因為兩個“不是數字”的東西(嚴格來說)不能說彼此相等——請參閱對於 IEEE754 NaN 值返回 false 的所有比較的基本原理是什么? 了解更多詳情和信息。

相反,如果您需要確定值是否為 NaN,請使用math.isnan(...)

此外,當嘗試將 NaN 存儲在容器類型(例如listdict (或使用自定義容器類型時)時,對 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(...)也適用於 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')Fraction(float('inf'))並且會拋出異常,就像 NaN 一樣。

如果您想要一種快速簡便的方法來檢查數字是否既不是 NaN 也不是無窮大,您可以從 Python 3.2+ 開始使用math.isfinite(...)


如果您想對復數進行類似的檢查, cmath模塊包含一組與math模塊類似的函數和常量:

nan = float('nan')

現在你有了常數nan

您可以類似地為 decimal.Decimal. 創建 NaN 值:

dnan = Decimal('nan')

使用float("nan")

>>> float("nan")
nan

可以從“inf - inf”得到NaN,也可以從大於2e308的數得到“inf”,所以,我一般用:

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM