Yanıtlar:
True
X bir NaN ise (sayı değil),False
aksi halde geri dönün .
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
tercih np.isnan()
?
import numpy
yaklaşık 15 MB RAM alırken import math
, yaklaşık 0,2 MB alır
numpy.isnan
NumPy dizilerini işlediği için üstün bir seçimdir. Eğer numpy kullanmıyorsanız, büyük ihtimalle bir NumPy bağımlılık alarak ve sadece NaN kontrolü için numpy yüklemek için vakit (ancak NaN denetimler yapar kod tür yazıyorsanız, bu kadar hiçbir yararı yoktur gerektiğini kullanıyor Dizi).
Bir NaN'yi test etmenin olağan yolu, kendisine eşit olup olmadığını görmektir:
def isNaN(num):
return num != num
numpy.isnan(number)
size olup olmadığını söyler NaN
.
numpy.all(numpy.isnan(data_list))
listedeki tüm öğelerin nan olup olmadığını belirlemeniz gerekirse de yararlıdır
all(map(math.isnan, [float("nan")]*5))
import pandas as pd
import numpy as np
import math
#For single variable all three libraries return single boolean
x1 = float("nan")
print(f"It's pd.isna : {pd.isna(x1)}")
print(f"It's np.isnan : {np.isnan(x1)}")
print(f"It's math.isnan : {math.isnan(x1)}")
Çıktı
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()
sorunlarımı çözer. Teşekkürler!
İşte bir cevap:
float('nan')
, numpy.nan
...Standardı takiben uygulanan bir NaN, kendisiyle eşitsizlik karşılaştırmasının True döndürmesi gereken tek değerdir:
def is_nan(x):
return (x != x)
Ve bazı örnekler:
import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
print(f"{repr(value):<8} : {is_nan(value)}")
Çıktı:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
normal bir Python float
nesnesidir, tıpkı döndürülen tür gibi float('nan')
. NumPy'de karşılaştığınız çoğu NaN numpy.nan
nesne olmayacaktır .
numpy.nan
NaN değerini C'deki temel kütüphanede kendi başına tanımlar . Python'un NaN'sini sarmaz. Ama şimdi, ikisi de C99 API'sine bağlı oldukları için IEEE 754 standardına uyuyor.
float('nan') is float('nan')
(benzersiz olmayan) ve np.nan is np.nan
(benzersiz)
np.nan
her float('nan')
çağrı yeni bir nesne oluştururken belirli bir nesnedir. Eğer yapsaydın nan = float('nan')
, o zaman sen nan is nan
de alırsın . Bir inşa halinde fiili gibi bir şeyle NumPy NaN np.float64('nan')
sonra olsun istiyorum np.float64('nan') is not np.float64('nan')
çok .
Aslında bununla karşılaştım, ama benim için nan, -inf veya inf'yi kontrol ediyordu. Az önce kullandım
if float('-inf') < float(num) < float('inf'):
Bu sayılar için doğrudur, nan ve her ikisi de inf için yanlıştır ve dizeler veya diğer türler (muhtemelen iyi bir şey) gibi şeyler için bir istisna oluşturur. Ayrıca bu, matematik veya numpy gibi herhangi bir kütüphanenin içe aktarılmasını gerektirmez (numpy çok büyüktür, herhangi bir derlenmiş uygulamanın boyutunu iki katına çıkarır).
math.isfinite
Python 3.2'ye kadar tanıtılmadı, bu yüzden @DaveTheScientist'in cevabı 2012'de yayınlandığında tam olarak "tekerleği yeniden icat" değildi - çözüm hala Python 2 ile çalışanlar için duruyor
veya sayıyı kendisiyle karşılaştırın. NaN daima! = (O takdirde örneğin NaN, aksi olan bir sayı) karşılaştırma başarılı olması gerekir.
Ben bu yazı girdi, çünkü ben fonksiyonu ile bazı sorunlar yaşadım:
math.isnan()
Bu kodu çalıştırdığınızda sorun var:
a = "hello"
math.isnan(a)
İstisna doğurur. Benim çözümüm başka bir kontrol yapmak:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
Python <2.6 ile bitirdim
def isNaN(x):
return str(float(x)).lower() == 'nan'
Bu benim için bir Solaris 5.9 kutusunda python 2.5.1 ve Ubuntu 10'da python 2.6.5 ile çalışıyor
-1.#IND
NaN
Dize olarak gönderen bir web hizmetinden veri alıyorum 'Nan'
. Ancak verilerimde başka tür dizeler de olabilir, bu nedenle basit float(value)
bir istisna fırlatabilir. Kabul edilen cevabın aşağıdaki varyantını kullandım:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
Gereksinimi:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
varlık hakkında ne söylüyor NaN
?
NaN
(python'da ne elde edebileceğiniz gibi float('inf') * 0
) ve böylece 'Merhaba' bir sayı olmamasına rağmen, aynı zamanda hala sayısal bir değer NaN
olduğu NaN
için değil !
int(value)
Tüm istisnalar False
için yazılır.
Değişkenin NaN veya None olup olmadığını anlamanın tüm yöntemleri:
Hiçbiri türü
In [1]: from numpy import math
In [2]: a = None
In [3]: not a
Out[3]: True
In [4]: len(a or ()) == 0
Out[4]: True
In [5]: a == None
Out[5]: True
In [6]: a is None
Out[6]: True
In [7]: a != a
Out[7]: False
In [9]: math.isnan(a)
Traceback (most recent call last):
File "<ipython-input-9-6d4d8c26d370>", line 1, in <module>
math.isnan(a)
TypeError: a float is required
In [10]: len(a) == 0
Traceback (most recent call last):
File "<ipython-input-10-65b72372873e>", line 1, in <module>
len(a) == 0
TypeError: object of type 'NoneType' has no len()
NaN tipi
In [11]: b = float('nan')
In [12]: b
Out[12]: nan
In [13]: not b
Out[13]: False
In [14]: b != b
Out[14]: True
In [15]: math.isnan(b)
Out[15]: True
Bir yinelemede karışık tipleriniz varsa, burada numpy kullanmayan bir çözüm var:
from math import isnan
Z = ['a','b', float('NaN'), 'd', float('1.1024')]
[x for x in Z if not (
type(x) == float # let's drop all float values…
and isnan(x) # … but only if they are nan
)]
['a', 'b', 'd', 1.1024]
Kısa devre değerlendirmesi, sağ tarafı değerlendirmek zorunda kalmadan hızlı bir şekilde değerlendirildiği isnan
gibi 'şamandıra' tipi olmayan değerlerde çağrılmayacağı anlamına gelir .False and (…)
False
Python 3.6'da x math.isnan (x) ve np.isnan (x) dize değerinin kontrol edilmesi bir hata oluşturur. Bu yüzden verilen değerin NaN olup olmadığını kontrol edemiyorum. Aşağıdakiler bu sorunu çözüyor gibi görünüyor
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
Görünüşe göre kendisinin eşit olup olmadığını kontrol etmek
x!=x
en hızlısıdır.
import pandas as pd
import numpy as np
import math
x = float('nan')
%timeit x!=x
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit math.isnan(x)
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit pd.isna(x)
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.isnan(x)
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
panda dizeleri için pd.isnull almak:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
NLTK için özellik çıkarma işlevi
def act_features(atext):
features = {}
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
if word not in default_stopwords:
features['cont({})'.format(word.lower())]=True
return features