關(guān)于Python中Inf與Nan的判斷問題詳解
大家都知道 在Python 中可以用如下方式表示正負(fù)無窮:
float("inf") # 正無窮 float("-inf") # 負(fù)無窮
利用 inf(infinite)
乘以 0 會(huì)得到 not-a-number(NaN)
。如果一個(gè)數(shù)超出 infinite,那就是一個(gè) NaN(not a number)
數(shù)。在 NaN 數(shù)中,它的 exponent 部分為可表達(dá)的最大值,即 FF(單精度)、7FF(雙精度)和 7FFF(擴(kuò)展雙精度)。 NaN 數(shù)與 infinite 數(shù)的區(qū)別是:infinite 數(shù)的 significand 部分為 0 值(擴(kuò)展雙精度的 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 中判斷一個(gè)浮點(diǎn)數(shù)是否為 NaN,對(duì)以上的輸出結(jié)果肯定會(huì)感到詫異。首先,對(duì)于正負(fù)無窮和 NaN 自身與自身用 is 操作,結(jié)果都是 True,這里好像沒有什么問題;但是如果用 == 操作,結(jié)果卻不一樣了, NaN 這時(shí)變成了 False。如果分別用 float 重新定義一個(gè)變量來與它們?cè)儆?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ù)撨@個(gè)問題,就是再忠告:不要在 Python 中試圖用 is 和 == 來判斷一個(gè)對(duì)象是否是正負(fù)無窮或者 NaN。你就乖乖的用 math 模塊吧,否則就是引火燒身。
當(dāng)然也有別的方法來作判斷,以下用 NaN 來舉例,但仍然推薦用 math 模塊,免得把自己弄糊涂。
用對(duì)象自身判斷自己
>>> 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ù)還可以對(duì)整個(gè) list 進(jìn)行判斷:
>>> 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ù)組,如果對(duì)應(yīng)位置為 NaN,返回 True,否則返回 False。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
Python通用循環(huán)的構(gòu)造方法實(shí)例分析
這篇文章主要介紹了Python通用循環(huán)的構(gòu)造方法,結(jié)合實(shí)例形式分析了Python常見的交互循環(huán)、哨兵循環(huán)、文件循環(huán)、死循環(huán)等實(shí)現(xiàn)與處理技巧,需要的朋友可以參考下2018-12-12Django配置Bootstrap, js實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Django配置Bootstrap, js實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10python 刪除列表里所有空格項(xiàng)的方法總結(jié)
下面小編就為大家分享一篇python 刪除列表里所有空格項(xiàng)的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python實(shí)現(xiàn)針對(duì)中文排序的方法
這篇文章主要介紹了Python實(shí)現(xiàn)針對(duì)中文排序的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python針對(duì)中文進(jìn)行排序操作出現(xiàn)的問題與相關(guān)處理技巧,需要的朋友可以參考下2017-05-05