数値をNaNまたは無限大に設定することは可能ですか?


203

NaNPythonで配列の要素をに設定することは可能ですか?

さらに、変数を+/-無限大に設定することは可能ですか?もしそうなら、数が無限大かどうかをチェックする機能はありますか?


3
stackoverflow.com/questions/944700は、NaNを確認する方法を示しています。Infと-Infの場合、==でテストできますが、NaNのIEEE754ルールのため、NaNでは機能しません。
David Heffernan

私が最も信頼できる方法のような適切な関数を使用することであると思いますisinfし、isnanなどにより提供されますnumpy。以下の私の答えを参照してください。
Olivier Verdier

回答:


272

文字列からキャストfloat()

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

1
それは私がもう一度質問を読む前にキップでジャンプしないことを教えてくれます!! ごめんなさい!とは言っても、NaN!= NaN
デビッドヘファーナン

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
python> = 2.6では、math.isnan()andmath.isinf()
Agos

8
numpyあなたが望むすべてがそうであるならば、それはかなり重いインポートですNaNinf
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")
  • 定数は、無地のPython返すオブジェクトを。cmathnumpyfloat
  • 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           
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
    

    withのオプションは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     
╘══════════╧═════════════╧════════════════╧════════════════════╛

再びいくつかの発言:

  • cmathおよびnumpy機能は、いずれかの実数または虚数部がNaNまたは無限大の場合、彼らはチェックしますが、複雑なオブジェクトのために働きます。
  • このnumpy関数は、numpy配列や、1つに変換できるすべてのもの(リスト、タプルなど)でも機能します。
  • NumPy:numpy.isposinfとに、正と負の無限大を明示的にチェックする関数もありnumpy.isneginfます。
  • パンダのかどうかを確認するために、2つの追加機能を提供していますNaNpandas.isna及びpandas.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))
    

これらの関数の予想される結果を要約するには(入力がfloatであると想定):

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

Pythonで配列の要素をNaNに設定することは可能ですか?

リストには問題ありません。いつでもNaN(またはInfinity)を含めることができます。

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

ただし、それをarray(たとえばarray.arrayまたはnumpy.array)に含めたい場合は、配列のタイプをorにする必要あります。そうでない場合は、配列タイプにダウンキャストしようとします。floatcomplex

>>> 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

simplejsonをPython 2.4を実行する組み込みデバイスに移植していたときに問題が発生しましたfloat("9e999")。修正しました。は使用しないでくださいinf = 9e999。文字列から変換する必要があります。 -infを与えます-Infinity

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.