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:
float
Ayrıca kullanabilmesi yapıcı, aslında küçük harfe duyarlı değildir float("NaN")
ya float("InFiNiTy")
.
cmath
Ve numpy
sabitler düz Python dönmek float
nesneleri.
numpy.NINF
Aslında gerektirmez benim bildiğim tek sabittir -
.
Karmaşık NaN ve Infinity oluşturmak mümkündür complex
ve 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 float
değ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:
cmath
Ve numpy
işlevleri de ya gerçek veya sanal kısmı NaN veya Infinity ise onlar kontrol edecek, karmaşık nesneler için çalışıyoruz.
numpy
Ayrı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.isposinf
ve numpy.isneginf
.
- Pandalar teklifler iki ek denetlemek için fonksiyonlar
NaN
: pandas.isna
ve pandas.isnull
(ama sadece NaN, aynı zamanda maçları None
ve 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.array
veya numpy.array
) daha sonra dizinin tipi zorundadır olmak float
ya complex
aksi çü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