숫자를 NaN 또는 무한대로 설정할 수 있습니까?


202

NaN파이썬에서 배열의 요소를 설정할 수 있습니까?

또한 변수를 +/- 무한대로 설정할 수 있습니까? 그렇다면 숫자가 무한대인지 여부를 확인하는 기능이 있습니까?


3
stackoverflow.com/questions/944700 은 NaN을 확인하는 방법을 알려줍니다. Inf 및 -Inf의 경우 ==로 테스트 할 수 있지만 NaN의 IEEE754 규칙으로 인해 NaN에서는 작동하지 않습니다.
David Heffernan

나는 가장 신뢰할 수있는 방법과 같은 적절한 기능을 사용하는 것입니다 생각 isinfisnan같은에서 제공 numpy. 아래 답변을 참조하십시오.
Olivier Verdier

답변:


271

다음을 사용하여 문자열에서 캐스트 float():

>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False

1
그것은 두 번 이상 질문을 읽기 전에 퀴즈로 뛰어 들지 말라고 가르쳐 줄 것입니다! 죄송합니다! NaN! = NaN
David Heffernan

2
또한 참고 : >>> float ( 'Inf')-float ( 'Inf') ===> nan
ntg

76

그렇습니다 numpy.

import numpy as np
a = arange(3,dtype=float)

a[0] = np.nan
a[1] = np.inf
a[2] = -np.inf

a # is now [nan,inf,-inf]

np.isnan(a[0]) # True
np.isinf(a[1]) # True
np.isinf(a[2]) # True

21
파이썬> = 2.6에, 당신은 사용할 수 있습니다 math.isnan()math.isinf()
아고

8
numpy만약 당신이 원하는 모든 NaN또는inf
cz

1
필요한 모든이 NaN또는 Inffrom numpy import nan, inf경우이 질문이 제기 된 후 존재할 수 있습니다.
andrewgu

37

숫자를 NaN 또는 무한대로 설정할 수 있습니까?

예, 실제로 몇 가지 방법이 있습니다. 가져 오기가없는 몇 가지 작업 import이 있지만 다른 사람들은 필요 하지만이 답변을 위해 개요의 라이브러리를 표준 라이브러리 및 NumPy (표준 라이브러리는 아니지만 매우 일반적인 타사 라이브러리)로 제한합니다.

다음 표는 숫자가 아니거나 양수 또는 음수 무한대를 만드는 방법을 요약 한 것입니다 float.

╒══════════╤══════════════╤════════════════════╤════════════════════╕
   result  NaN           Infinity            -Infinity          
 module                                                         
╞══════════╪══════════════╪════════════════════╪════════════════════╡
 built-in  float("nan")  float("inf")        -float("inf")      
                         float("infinity")   -float("infinity") 
                         float("+inf")       float("-inf")      
                         float("+infinity")  float("-infinity") 
├──────────┼──────────────┼────────────────────┼────────────────────┤
 math      math.nan      math.inf            -math.inf          
├──────────┼──────────────┼────────────────────┼────────────────────┤
 cmath     cmath.nan     cmath.inf           -cmath.inf         
├──────────┼──────────────┼────────────────────┼────────────────────┤
 numpy     numpy.nan     numpy.PINF          numpy.NINF         
           numpy.NaN     numpy.inf           -numpy.inf         
           numpy.NAN     numpy.infty         -numpy.infty       
                         numpy.Inf           -numpy.Inf         
                         numpy.Infinity      -numpy.Infinity    
╘══════════╧══════════════╧════════════════════╧════════════════════╛

테이블에 몇 가지 언급이 있습니다.

  • float당신은 또한 사용할 수 있도록 생성자는 실제로 대소 문자를 구분 float("NaN")float("InFiNiTy").
  • cmathnumpy상수는 일반 파이썬 반환 float객체.
  • numpy.NINF실제로 필요하지 않습니다 필자가 아는 유일한 상수이다 -.
  • 복잡한 NaN이와 무한대를 만들 수 있습니다 complexcmath:

    ╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
       result  NaN+0j          0+NaNj           Inf+0j               0+Infj               
     module                                                                               
    ╞══════════╪════════════════╪═════════════════╪═════════════════════╪══════════════════════╡
     built-in  complex("nan")  complex("nanj")  complex("inf")       complex("infj")      
                                                complex("infinity")  complex("infinityj") 
    ├──────────┼────────────────┼─────────────────┼─────────────────────┼──────────────────────┤
     cmath     cmath.nan ¹     cmath.nanj       cmath.inf ¹          cmath.infj           
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
    

    ¹ 옵션은 a가 float아닌 일반을 반환 합니다 complex.

숫자가 무한대인지 여부를 확인하는 기능이 있습니까?

그렇습니다. 실제로 NaN, Infinity 및 Nan 또는 Inf에는 몇 가지 기능이 있습니다. 그러나 이러한 사전 정의 된 기능은 내장되어 있지 않으며 항상 다음이 필요합니다 import.

╒══════════╤═════════════╤════════════════╤════════════════════╕
      for  NaN          Infinity or     not NaN and        
                        -Infinity       not Infinity and   
 module                                 not -Infinity      
╞══════════╪═════════════╪════════════════╪════════════════════╡
 math      math.isnan   math.isinf      math.isfinite      
├──────────┼─────────────┼────────────────┼────────────────────┤
 cmath     cmath.isnan  cmath.isinf     cmath.isfinite     
├──────────┼─────────────┼────────────────┼────────────────────┤
 numpy     numpy.isnan  numpy.isinf     numpy.isfinite     
╘══════════╧═════════════╧════════════════╧════════════════════╛

다시 몇 가지 말 :

  • cmathnumpy함수는 하나 실제 또는 가상의 일부가 NaN 또는 무한대의 경우 그들은 확인합니다, 복잡한 개체를 작동합니다.
  • numpy함수는 numpy배열 및 목록, 튜플 등으로 변환 할 수있는 모든 항목 에서도 작동합니다 .
  • NumPy : numpy.isposinf및 에서 음의 무한대를 명시 적으로 검사하는 함수도 있습니다 numpy.isneginf.
  • Pandas는 확인할 두 가지 추가 기능을 제공합니다 NaN. pandas.isnapandas.isnull(NaN뿐만 아니라 NoneNaT)
  • 내장 함수가 없더라도 직접 작성하는 것이 쉬울 것입니다 (여기에서 형식 검사 및 문서를 무시했습니다).

    def isnan(value):
        return value != value  # NaN is not equal to anything, not even itself
    
    infinity = float("infinity")
    
    def isinf(value):
        return abs(value) == infinity 
    
    def isfinite(value):
        return not (isnan(value) or isinf(value))
    

이러한 함수에 대한 예상 결과를 요약하려면 (입력이 부동이라고 가정) :

╒════════════════╤═══════╤════════════╤═════════════╤══════════════════╕
          input  NaN    Infinity    -Infinity    something else   
 function                                                         
╞════════════════╪═══════╪════════════╪═════════════╪══════════════════╡
 isnan           True   False       False        False            
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
 isinf           False  True        True         False            
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
 isfinite        False  False       False        True             
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛

파이썬에서 배열의 요소를 NaN으로 설정할 수 있습니까?

목록에서 문제가되지 않으므로 언제든지 NaN (또는 무한대)을 포함 할 수 있습니다.

>>> [math.nan, math.inf, -math.inf, 1]  # python list
[nan, inf, -inf, 1]

당신이에 포함하려는 그러나 경우 array(예 : array.array또는 numpy.array) 다음 배열의 형태가 되어야float또는 complex그렇지 있기 때문에 배열의 유형으로 다운 캐스트하려고합니다!

>>> import numpy as np
>>> float_numpy_array = np.array([0., 0., 0.], dtype=float)
>>> float_numpy_array[0] = float("nan")
>>> float_numpy_array
array([nan,  0.,  0.])

>>> import array
>>> float_array = array.array('d', [0, 0, 0])
>>> float_array[0] = float("nan")
>>> float_array
array('d', [nan, 0.0, 0.0])

>>> integer_numpy_array = np.array([0, 0, 0], dtype=int)
>>> integer_numpy_array[0] = float("nan")
ValueError: cannot convert float NaN to integer

1
참고 : math.isnan복소수에서는 작동하지 않습니다. math.isnan(x.real) or math.isnan(x.imag)대신 사용하십시오 .
Jonathan H

2

Python 2.4를 사용할 때 시도하십시오

inf = float("9e999")
nan = inf - inf

Python 2.4를 실행하는 임베디드 장치로 simplejson을 이식 할 때 문제가 발생 float("9e999")했습니다. 를 사용하지 마십시오 inf = 9e999. 문자열에서 변환해야합니다. -inf을 제공합니다 -Infinity.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.