簡體   English   中英

如何檢查 Python 中的 float('nan')?

[英]How to check for float('nan') in Python?

在我正在處理的一些數據中,我遇到了float類型的數據,這些數據用 'nan' 填充,即float('nan')

但是檢查它不能按預期工作:

float('nan') == float('nan')
>> False

您可以使用math.isnan進行檢查,但由於我的數據還包含字符串(例如:'nan',還有其他用戶輸入),所以不太方便:

import math
math.isnan(float('nan'))
>> True
math.isnan('nan')
>> TypeError: must be real number, not str

在理想的世界中,我想檢查一個值是否在所有可能的 NaN 值的列表中,例如:

import numpy as np
if x in ['nan', np.nan, ... ]:
    # Do something
    pass

現在的問題是:我怎樣才能在使用這種方法的同時檢查float('nan')值? 為什么等於float('nan') == float('nan') False

這很行人,而且有點難看,但為什么不做以下事情呢?

import math
import numpy as np

if math.isnan(x) or x in ['nan', np.nan, ... ]:
    # Do something
    pass

我想推薦一個尤達表達式,但還沒有完全解決。

如果您想清掃地毯下的所有東西,請將其放入 lambda 或 function 中。

https://stackoverflow.com/a/64090763/1021819 開始,您可以嘗試讓迭代器以懶惰的方式評估任何內容。 那么問題是,如果第一個條件都沒有計算為True ,那么math.isnan()調用被執行並且仍然可以拋出TypeError 如果你懶惰地評估,你可以通過對str的類型檢查來保護math.isnan()調用:

fn_list_to_check=[
    lambda x: x in ['nan', np.nan, ... ],
    lambda x: not isinstance(x, str),
    lambda x: math.isnan(x)
    ]

if any(f(x) for f in fn_list_to_check):
    # Do something
    pass

請注意,any 中沒有方列表括號,即any()而不是any([]) (誰知道?)。

我認為它非常出色但同樣丑陋 - 選擇你的毒葯。

對於問題的第二部分(為什么float('nan') != float('nan') ),請參閱

對於 IEEE754 NaN 值返回 false 的所有比較的基本原理是什么?

為什么不用另一個float轉換來包裝你傳遞給math.isnan的任何東西呢? 如果它已經是一個浮點數(即float('nan') ),您只需進行“冗余”調用:

import math

def is_nan(value):
    return math.isnan(float(value))

這似乎給了你預期的結果:

>>> is_nan(float('nan'))
True
>>> is_nan('nan')
True
>>> is_nan(np.nan)
True

您可以像這樣檢查 NaN 值,

def isNaN(num):
    return num!= num

NaN 表示為“非數字”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM