numpy없이 파이썬에서 변수 NaN 할당


103

대부분의 언어에는 NaN 값을 변수에 할당하는 데 사용할 수있는 NaN 상수가 있습니다. 파이썬은 numpy를 사용하지 않고 이것을 할 수 있습니까?


1
C, C ++, java, C #, ocaml은 많은 언어의 일부입니다.
zelinka 2013 년

2
C에서 NaN은 NAN; math.hC99부터 에서 정의 된 상수 입니다. (가장 최근에 표준화 된 언어를 그 언어로 부르는 것이 공평하다고 생각합니다. 따라서 "C"는 C11입니다.) ( stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in 참조) -c ); C에서 + +, 그건 NAN아니라, 또한 거기로 nan(), nanf()그리고 nanl()나는 조금 덜 특정 그들이 무엇인지에 있어요 불구하고. double.NaN자바, Double.NaNC #에서 ...
타나토스

답변:


169

예- 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를 반환하는 모든 비교의 근거는 무엇입니까 ?를 참조하십시오 . 자세한 내용과 정보는.

대신 math.isnan(...)값이 NaN인지 확인해야하는 경우 사용 합니다.

또한 ==NaN 값 에 대한 작업 의 정확한 의미는 list또는 같은 컨테이너 유형 내에 NaN을 저장하려고 할 dict때 (또는 사용자 정의 컨테이너 유형을 사용할 때) 미묘한 문제를 일으킬 수 있습니다 . 자세한 내용 은 컨테이너에서 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 객체에서도 작동합니다.


그러나 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도 무한도 아닌지 확인하는 빠르고 쉬운 방법을 원한다면 math.isfinite(...)Python 3.2 이상부터 사용할 수 있습니다 .


복소수로 유사한 검사를 수행하려면 cmath모듈에 모듈과 유사한 함수 및 상수 세트가 포함됩니다 math.


2
float ( 'nan) 사용은 np.nan을 사용하는 것보다 3 배 느리고 nan = float ('nan ')을 한 번 할당 한 다음 모든 후속 할당에 대해 변수'nan '을 사용하는 것보다 약 6.5 배 느립니다 (abarnert 's에서 제안한대로). 대답).
Daniel Goldfarb

18
nan = float('nan')

이제 상수 nan.

마찬가지로 decimal.Decimal에 대한 NaN 값을 만들 수 있습니다. :

dnan = Decimal('nan')

이것은 다중 nan 할당에 대한 가장 효율적인 대답입니다. 즉, float ( 'nan')을 한 번만 사용하고 나머지 모든 할당에 할당 된 상수를 사용합니다. 그러나 nan total의 할당을 한두 번만 수행하는 경우 numpy.nan을 사용하는 것이 가장 빠릅니다.
Daniel Goldfarb

7

사용 float("nan"):

>>> float("nan")
nan


6

"inf-inf"에서 NaN을 얻을 수 있고 2e308보다 큰 숫자에서 "inf"를 얻을 수 있으므로 일반적으로 다음을 사용했습니다.

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan

3
이 답변은 부당하게 반대 투표를했습니다. .txt 파일에 작은 구문 분석 테스트를 많이 작성하고 ast.literal_eval을 사용하여 예상 출력 부분을 얻습니다. 거기에서 float ( 'nan')을 호출하는 것은 불가능하며이 답변은 저에게 도움이되었습니다.
Vitalik Verhovodov

0

inf 및 -inf를 생성하는보다 일관되고 덜 불투명 한 방법은 float ()를 다시 사용하는 것입니다.

>> positive_inf = float('inf')
>> positive_inf
inf
>> negative_inf = float('-inf')
>> negative_inf
-inf

float의 크기는 아키텍처에 따라 다르므로 작동 할 가능성이 있더라도 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.