ほとんどの言語には、変数に値NaNを割り当てるために使用できる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である2つのものが互いに等しいかどうかを確認すると、常にfalseが返されます。これは、「数値ではない」2つのことを(厳密に言えば)互いに等しいとは言えないためです IEEE754 NaN値に対してfalseを返すすべての比較の根拠は何ですか? =詳細および情報について。
代わりに、値がNaNかどうかを判断する必要がある場合は、 math.isnan(...)
を使用します。
さらに、NaN値に対する==
操作の正確なセマンティクスは、list
やdict
などのコンテナータイプ内に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オブジェクトでも動作します。
ただし、あなたはcannotPythonの 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'))
と同等)nan = float('nan')
これで、定数nan
が得られました。
同様に、decimal.DecimalのNaN値を作成できます。
dnan = Decimal('nan')
float("nan")
を使用します。
>>> float("nan")
nan
float('nan')
を実行してNaNを取得できます。
「inf-inf」からNaNを取得でき、2e308を超える数から「inf」を取得できるため、通常は次のように使用しました。
>>> inf = 9e999
>>> inf
inf
>>> inf - inf
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)