NaN veya sonsuz olarak bir sayı ayarlamak mümkün mü?


206

Bir dizinin elemanını NaNPython'da ayarlamak mümkün müdür ?

Ayrıca, bir değişkeni +/- sonsuza ayarlamak mümkün müdür? Öyleyse, bir sayının sonsuz olup olmadığını kontrol etmek için herhangi bir işlev var mı?


3
stackoverflow.com/questions/944700 , NaN'yi nasıl kontrol edeceğinizi anlatır. Inf ve -Inf için == ile test edebilirsiniz ancak NaN için IEEE754 kuralları nedeniyle bu NaN için çalışmaz.
David Heffernan

Bence en güvenilir yol, sağladığı isinfve isnansağladığı gibi doğru fonksiyonları kullanmaktır numpy. Cevabımı aşağıda görebilirsiniz.
Olivier Verdier

Yanıtlar:


273

Aşağıdakileri kullanarak dizeden yayınlayın float():

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

1
Bu bana soruyu ikinci kez okumadan önce bir quip ile atlamamayı öğretecek !! Afedersiniz! Bununla birlikte, aynı şeyi söylemek zarar vermez, çünkü düşmek kolay bir tuzaktır, NaN! = NaN
David Heffernan 25:30

2
ayrıca not: >>> float ('Inf') - float ('Inf') ===> nan
ntg

77

Evet, numpybunun için kullanabilirsiniz .

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
Piton> = 2.6 üzerinde, sadece kullanabilirsiniz math.isnan()vemath.isinf()
Agos

8
numpyİstediğiniz tek şey oldukça ağır bir ithalat NaNveyainf
cz

1
İhtiyacınız olan tek şey NaNya da Inf, from numpy import nan, infbu soru ortaya çıktığından beri var olan biri olabilir .
andrewgu

37

NaN veya sonsuz olarak bir sayı ayarlamak mümkün mü?

Evet, aslında birkaç yol var. Bazıları herhangi bir ithalat olmadan çalışır import, ancak diğerleri gerektirir , ancak bu cevap için genel bakıştaki kütüphaneleri standart kütüphane ve NumPy ile sınırlayacağım (standart kütüphane değil, çok yaygın bir üçüncü taraf kütüphanesi).

Aşağıdaki tablo, bir sayı olmayan veya pozitif veya negatif sonsuzluğu nasıl oluşturabileceğinizi özetler 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    
╘══════════╧══════════════╧════════════════════╧════════════════════╛

Bir çift tabloya dikkat çekiyor:

  • floatAyrıca kullanabilmesi yapıcı, aslında küçük harfe duyarlı değildir float("NaN")ya float("InFiNiTy").
  • cmathVe numpysabitler düz Python dönmek floatnesneleri.
  • numpy.NINFAslında gerektirmez benim bildiğim tek sabittir -.
  • Karmaşık NaN ve Infinity oluşturmak mümkündür complexve cmath:

    ╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
       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 ile seçenekler düz floatdeğil, düz döndürür complex.

sayının sonsuz olup olmadığını kontrol etmek için herhangi bir işlev var mı?

Evet var - aslında NaN, Infinity ve ne Nan ne de Inf için birkaç fonksiyon var. Ancak bu önceden tanımlanmış işlevler yerleşik değildir, her zaman aşağıdakileri gerektirir 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     
╘══════════╧═════════════╧════════════════╧════════════════════╛

Yine birkaç açıklama:

  • cmathVe numpyişlevleri de ya gerçek veya sanal kısmı NaN veya Infinity ise onlar kontrol edecek, karmaşık nesneler için çalışıyoruz.
  • numpyAyrıca fonksiyonlar işin numpy(vb listeleri, başlığın gibi) birine dönüştürülebilir diziler ve her şeyi
  • NumPy'de pozitif ve negatif sonsuzluğu açıkça kontrol eden fonksiyonlar da vardır: numpy.isposinfve numpy.isneginf.
  • Pandalar teklifler iki ek denetlemek için fonksiyonlar NaN: pandas.isnave pandas.isnull(ama sadece NaN, aynı zamanda maçları Noneve NaT)
  • Yerleşik işlevler olmasa da, bunları kendiniz oluşturmak kolay olurdu (burada tür denetimi ve dokümantasyonunu ihmal ettim):

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

Bu işlevler için beklenen sonuçları özetlemek için (girdinin şamandıralı olduğu varsayılarak):

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

Bir dizinin elemanını Python'da NaN olarak ayarlamak mümkün müdür?

Listede sorun değil, her zaman NaN (veya Infinity) ekleyebilirsiniz:

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

İster şirket dahil etmek istiyorsanız Ancak eğer array(örneğin array.arrayveya numpy.array) daha sonra dizinin tipi zorundadır olmak floatya complexaksi çünkü diziler türüne bunu downcast çalışacağız!

>>> 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
Not: math.isnankarmaşık sayılarla çalışmaz. math.isnan(x.real) or math.isnan(x.imag)Bunun yerine kullanın .
Jonathan H

2

Python 2.4 kullanırken,

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

Simplejson'u Python 2.4'ü çalıştıran gömülü bir cihaza sabitlerken sorunla karşı karşıya kaldım float("9e999"). Kullanmayın inf = 9e999, dizeden dönüştürmeniz gerekir. -infverir -Infinity.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.