float('nan')ผลลัพธ์ในน่าน (ไม่ใช่ตัวเลข) แต่ฉันจะตรวจสอบได้อย่างไร น่าจะง่ายมาก แต่ฉันหามันไม่เจอ
float('nan')ผลลัพธ์ในน่าน (ไม่ใช่ตัวเลข) แต่ฉันจะตรวจสอบได้อย่างไร น่าจะง่ายมาก แต่ฉันหามันไม่เจอ
คำตอบ:
ส่งคืน
Trueถ้า x เป็น NaN (ไม่ใช่ตัวเลข) และเป็นFalseอย่างอื่น
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnanที่ต้องการnp.isnan()หรือไม่
import numpyใช้เวลาประมาณ RAM 15 MB ในขณะที่import mathใช้เวลา 0,2 MB บางส่วน
numpy.isnanเป็นตัวเลือกที่ดีกว่าเพราะจัดการกับ NumPy arrays หากคุณไม่ได้ใช้ NumPy ไม่มีประโยชน์ที่จะได้รับการพึ่งพา NumPy และใช้เวลาในการโหลด NumPy เพียงเพื่อตรวจสอบ NaN (แต่ถ้าคุณกำลังเขียนโค้ดประเภทที่ทำหน้าที่ตรวจสอบ NaN เป็นไปได้ว่าคุณควรจะใช้ NumPy)
วิธีปกติในการทดสอบ NaN คือดูว่ามีค่าเท่ากันหรือไม่:
def isNaN(num):
return num != num
numpy.isnan(number)บอกคุณว่ามันเป็นNaNหรือไม่
numpy.all(numpy.isnan(data_list))นอกจากนี้ยังมีประโยชน์หากคุณต้องการตรวจสอบว่าองค์ประกอบทั้งหมดในรายการเป็นน่าน
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)}")
เอาท์พุต
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()แก้ปัญหาของฉัน ขอบคุณ!
นี่คือคำตอบที่ทำงานกับ:
float('nan'), numpy.nan...NaN ดำเนินการตามมาตรฐานเป็นเพียงค่าเดียวที่การเปรียบเทียบความไม่เท่าเทียมกับตัวมันเองควรคืนค่าเป็นจริง:
def is_nan(x):
return (x != x)
และตัวอย่างบางส่วน:
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)}")
เอาท์พุท:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nanเป็นงูหลามปกติวัตถุเช่นเดียวกับที่ส่งกลับชนิดโดยfloat float('nan')NaN ส่วนใหญ่ที่คุณพบใน NumPy จะไม่ใช่numpy.nanวัตถุ
numpy.nanกำหนดค่าน่านของมันในตัวเองในห้องสมุดต้นแบบใน C มันไม่ห่อ NaN ของงูใหญ่ แต่ตอนนี้พวกเขาทั้งสองปฏิบัติตามมาตรฐาน IEEE 754 เนื่องจากพวกเขาพึ่งพา C99 API
float('nan') is float('nan')(ไม่ซ้ำกัน) และnp.nan is np.nan(ไม่ซ้ำ)
np.nanเป็นวัตถุเฉพาะในขณะที่การfloat('nan')โทรแต่ละครั้งสร้างวัตถุใหม่ ถ้าคุณทำnan = float('nan')เช่นนั้นคุณก็จะได้รับnan is nanเช่นกัน ถ้าคุณสร้างจริง NumPy น่านกับสิ่งที่ต้องการnp.float64('nan')แล้วคุณจะได้รับnp.float64('nan') is not np.float64('nan')มากเกินไป
ที่จริงฉันเพิ่งพบเจอปัญหานี้ แต่สำหรับฉันมันคือการตรวจสอบว่าน่าน -inf หรือ inf ฉันเพิ่งใช้
if float('-inf') < float(num) < float('inf'):
นี่เป็นเรื่องจริงสำหรับตัวเลขเท็จสำหรับน่านและทั้ง inf และจะเพิ่มข้อยกเว้นสำหรับสิ่งต่าง ๆ เช่นสตริงหรือประเภทอื่น ๆ (ซึ่งอาจเป็นสิ่งที่ดี) นอกจากนี้สิ่งนี้ไม่จำเป็นต้องนำเข้าไลบรารีใด ๆ เช่น math หรือ numpy (numpy นั้นใหญ่มากจนขนาดของแอปพลิเคชั่นที่คอมไพล์แล้ว)
math.isfiniteไม่ได้ถูกนำมาใช้จนกระทั่ง Python 3.2 ดังนั้นคำตอบจาก @DaveTheScientist จึงถูกโพสต์ในปี 2012 มันไม่ใช่ "reinvent [ing] the wheel" - โซลูชันยังคงใช้ได้สำหรับผู้ที่ทำงานกับ Python 2
หรือเปรียบเทียบตัวเลขกับตัวเอง NaN อยู่เสมอ! = NaN มิฉะนั้น (เช่นถ้าเป็นตัวเลข) การเปรียบเทียบควรสำเร็จ
อีกวิธีหนึ่งหากคุณติดค้างที่ <2.6 คุณไม่มีปัญหาและคุณไม่มีการรองรับ IEEE 754:
def isNaN(x):
return str(x) == str(1e400*0)
ฉันเข้าสู่โพสต์นี้เพราะฉันมีปัญหากับฟังก์ชั่น:
math.isnan()
มีปัญหาเมื่อคุณเรียกใช้รหัสนี้:
a = "hello"
math.isnan(a)
มันทำให้เกิดข้อยกเว้น ทางออกของฉันคือการตรวจสอบอีกครั้ง:
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 ฉันลงเอยด้วย
def isNaN(x):
return str(float(x)).lower() == 'nan'
สิ่งนี้ใช้ได้กับฉันด้วย python 2.5.1 บนกล่อง Solaris 5.9 และ python 2.6.5 บน Ubuntu 10
-1.#IND
ฉันได้รับข้อมูลจากบริการเว็บที่ส่งเป็นสตริงNaN 'Nan'แต่อาจมีสตริงอื่น ๆ ในข้อมูลของฉันเช่นกันดังนั้นข้อผิดพลาดง่าย ๆfloat(value)อาจทำให้เกิดข้อยกเว้น ฉันใช้ตัวแปรคำตอบที่ยอมรับต่อไปนี้:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
ต้องการ:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
valueการเป็นNaNหรือไม่?
NaN(เช่นในงูหลามสิ่งที่คุณจะได้รับจากfloat('inf') * 0) และดังนั้นแม้ว่าสตริง 'Hello' ไม่ได้เป็นจำนวน แต่มันก็ไม่ได้NaNเพราะNaNยังคงเป็นค่าตัวเลข!
int(value)ยกเว้นทั้งหมดFalseจะถูกเขียน
วิธีการทั้งหมดที่จะบอกว่าตัวแปรคือ NaN หรือไม่มี:
ไม่มีประเภท
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
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
หากคุณมีประเภทผสมใน iterable นี่คือวิธีการแก้ปัญหาที่ไม่ได้ใช้ numpy:
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]
การประเมินการลัดวงจรหมายความว่าisnanจะไม่ถูกเรียกใช้บนค่าที่ไม่ใช่ของประเภท 'ลอย' เมื่อFalse and (…)ประเมินอย่างรวดเร็วFalseโดยไม่ต้องประเมินทางด้านขวามือ
ใน Python 3.6 การตรวจสอบค่าสตริง x math.isnan (x) และ np.isnan (x) ทำให้เกิดข้อผิดพลาด ดังนั้นฉันไม่สามารถตรวจสอบว่าค่าที่กำหนดเป็น NaN หรือไม่ถ้าฉันไม่ทราบล่วงหน้าว่าเป็นตัวเลข ดูเหมือนว่าต่อไปนี้เพื่อแก้ไขปัญหานี้
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
ดูเหมือนว่าการตรวจสอบว่ามันเท่ากับตัวเอง
x!=x
เร็วที่สุด
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)
สำหรับน่านชนิดลอย
>>> import pandas as pd
>>> value = float(nan)
>>> type(value)
>>> <class 'float'>
>>> pd.isnull(value)
True
>>>
>>> value = 'nan'
>>> type(value)
>>> <class 'str'>
>>> pd.isnull(value)
False
สำหรับสตริงใน panda take pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
ฟังก์ชั่นเป็นคุณสมบัติการแยกสำหรับ NLTK
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