1. ホーム
  2. python

[解決済み] Pythonでnumpyを使わずに変数にNaNを代入する

2022-09-01 12:45:59

質問

ほとんどの言語には、変数に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である2つのものが互いに等しいかどうかをチェックすると、常に偽が返されることに注意してください。これは、quot;not a number" である 2 つのものが (厳密に言えば) 互いに等しいと言うことができないことが理由の 1 つです。 IEEE754 の NaN 値に対してすべての比較が false を返すことの根拠は何ですか? を参照してください。

代わりに math.isnan(...) を使ってください。

さらに、正確なセマンティクスは == のようなコンテナ型の中にNaNを格納しようとすると、微妙な問題を引き起こす可能性があります。 list または dict (を使用する場合(またはカスタムコンテナタイプを使用する場合)。参照 コンテナ内のNaNの存在を確認する を参照してください。


また、Pythonの 10進数 モジュールを使っても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オブジェクトでも動作します。


しかし、あなたは はできません。 でNaNを構成することはできません。 分数 モジュールで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でも無限でもないことを素早く簡単に確認したいのであれば math.isfinite(...) を使うことができます。


複素数で同様のチェックを行いたい場合は cmath モジュールと同じような関数と定数のセットが含まれています。 math モジュールと同じような関数と定数が含まれています。