web-dev-qa-db-ja.com

numpyなしでpythonに変数NaNを割り当てる

ほとんどの言語には、変数に値NaNを割り当てるために使用できるNaN定数があります。 python numpyを使用せずにこれを実行できますか?

85
zelinka

はい-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値に対する==操作の正確なセマンティクスは、listdictなどのコンテナータイプ内に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モジュールと同様の関数と定数のセットが含まれます。

136
Michael0x2a
nan = float('nan')

これで、定数nanが得られました。

同様に、decimal.DecimalのNaN値を作成できます。

dnan = Decimal('nan')
13
abarnert

float("nan")を使用します。

>>> float("nan")
nan
6
orlp

float('nan')を実行してNaNを取得できます。

5
BrenBarn

「inf-inf」からNaNを取得でき、2e308を超える数から「inf」を取得できるため、通常は次のように使用しました。

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan
3
Junior Polegato

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)
0
user3685621