關(guān)于Python中Inf與Nan的判斷問題詳解
大家都知道 在Python 中可以用如下方式表示正負(fù)無窮:
float("inf") # 正無窮 float("-inf") # 負(fù)無窮
利用 inf(infinite)
乘以 0 會得到 not-a-number(NaN)
。如果一個數(shù)超出 infinite,那就是一個 NaN(not a number)
數(shù)。在 NaN 數(shù)中,它的 exponent 部分為可表達的最大值,即 FF(單精度)、7FF(雙精度)和 7FFF(擴展雙精度)。 NaN 數(shù)與 infinite 數(shù)的區(qū)別是:infinite 數(shù)的 significand 部分為 0 值(擴展雙精度的 bit63 位為 1);而 NaN 數(shù)的 significand 部分不為 0 值。
我們先看看如下的代碼:
>>> inf = float("inf") >>> ninf = float("-inf") >>> nan = float("nan") >>> inf is inf True >>> ninf is ninf True >>> nan is nan True >>> inf == inf True >>> ninf == ninf True >>> nan == nan False >>> inf is float("inf") False >>> ninf is float("-inf") False >>> nan is float("nan") False >>> inf == float("inf") True >>> ninf == float("-inf") True >>> nan == float("nan") False
如果你沒有嘗試過在 Python 中判斷一個浮點數(shù)是否為 NaN,對以上的輸出結(jié)果肯定會感到詫異。首先,對于正負(fù)無窮和 NaN 自身與自身用 is 操作,結(jié)果都是 True,這里好像沒有什么問題;但是如果用 == 操作,結(jié)果卻不一樣了, NaN 這時變成了 False。如果分別用 float 重新定義一個變量來與它們再用 is 和 == 比較,結(jié)果仍然出人意料。出現(xiàn)這種情況的原因稍稍有些復(fù)雜,這里就不贅術(shù)了,感興趣可以查閱相關(guān)資料。
如果你希望正確的判斷 Inf 和 Nan 值,那么你應(yīng)該使用 math 模塊的 math.isinf
和 math.isnan
函數(shù):
>>> import math >>> math.isinf(inf) True >>> math.isinf(ninf) True >>> math.isnan(nan) True >>> math.isinf(float("inf")) True >>> math.isinf(float("-inf")) True >>> math.isnan(float("nan")) True
這樣便準(zhǔn)確無誤了。既然我在談?wù)撨@個問題,就是再忠告:不要在 Python 中試圖用 is 和 == 來判斷一個對象是否是正負(fù)無窮或者 NaN。你就乖乖的用 math 模塊吧,否則就是引火燒身。
當(dāng)然也有別的方法來作判斷,以下用 NaN 來舉例,但仍然推薦用 math 模塊,免得把自己弄糊涂。
用對象自身判斷自己
>>> def isnan(num): ... return num != num ... >>> isnan(float("nan")) True
用 numpy 模塊的函數(shù)
>>> import numpy as np >>> >>> np.isnan(np.nan) True >>> np.isnan(float("nan")) True >>> np.isnan(float("inf")) False
Numpy 的 isnan 函數(shù)還可以對整個 list 進行判斷:
>>> lst = [1, float("nan"), 2, 3, np.nan, float("-inf"), 4, np.nan] >>> lst [1, nan, 2, 3, nan, -inf, 4, nan] >>> np.isnan(lst) array([False, True, False, False, True, False, False, True], dtype=bool)
這里的 np.isnan
返回布爾值數(shù)組,如果對應(yīng)位置為 NaN,返回 True,否則返回 False。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Python通用循環(huán)的構(gòu)造方法實例分析
這篇文章主要介紹了Python通用循環(huán)的構(gòu)造方法,結(jié)合實例形式分析了Python常見的交互循環(huán)、哨兵循環(huán)、文件循環(huán)、死循環(huán)等實現(xiàn)與處理技巧,需要的朋友可以參考下2018-12-12Django配置Bootstrap, js實現(xiàn)過程詳解
這篇文章主要介紹了Django配置Bootstrap, js實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10