關(guān)于Python中Inf與Nan的判斷問(wèn)題詳解
大家都知道 在Python 中可以用如下方式表示正負(fù)無(wú)窮:
float("inf") # 正無(wú)窮
float("-inf") # 負(fù)無(wú)窮
利用 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
如果你沒(méi)有嘗試過(guò)在 Python 中判斷一個(gè)浮點(diǎn)數(shù)是否為 NaN,對(duì)以上的輸出結(jié)果肯定會(huì)感到詫異。首先,對(duì)于正負(fù)無(wú)窮和 NaN 自身與自身用 is 操作,結(jié)果都是 True,這里好像沒(méi)有什么問(wèn)題;但是如果用 == 操作,結(jié)果卻不一樣了, NaN 這時(shí)變成了 False。如果分別用 float 重新定義一個(gè)變量來(lái)與它們?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ú)誤了。既然我在談?wù)撨@個(gè)問(wèn)題,就是再忠告:不要在 Python 中試圖用 is 和 == 來(lái)判斷一個(gè)對(duì)象是否是正負(fù)無(wú)窮或者 NaN。你就乖乖的用 math 模塊吧,否則就是引火燒身。
當(dāng)然也有別的方法來(lái)作判斷,以下用 NaN 來(lái)舉例,但仍然推薦用 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í)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
pytest生成簡(jiǎn)單自定義測(cè)試結(jié)果的html報(bào)告
這篇文章主要為大家介紹了pytest生成簡(jiǎn)單自定義測(cè)試結(jié)果html報(bào)告,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
python中讀取txt文件時(shí)split()函數(shù)的妙用
這篇文章主要介紹了python中讀取txt文件時(shí)split()函數(shù)的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Tensorflow之構(gòu)建自己的圖片數(shù)據(jù)集TFrecords的方法
本篇文章主要介紹了Tensorflow之構(gòu)建自己的圖片數(shù)據(jù)集TFrecords的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
基于python實(shí)現(xiàn)Pycharm斷點(diǎn)調(diào)試
這篇文章主要介紹了基于python實(shí)現(xiàn)Pycharm斷點(diǎn)調(diào)試,在我們寫(xiě)程序的時(shí)候,很容易遇到各種各樣的bug,然后編譯器提示程序出錯(cuò)的地方。很多時(shí)候可以通過(guò)提示的信息修改程序,但是有時(shí)我們想得到更多的信息,這個(gè)時(shí)候就需要進(jìn)行斷點(diǎn)調(diào)試,下面我們就一起來(lái)學(xué)習(xí)ycharm斷點(diǎn)調(diào)試2022-02-02
Python小紅書(shū)旋轉(zhuǎn)驗(yàn)證碼識(shí)別實(shí)戰(zhàn)教程
這篇文章主要介紹了Python小紅書(shū)旋轉(zhuǎn)驗(yàn)證碼識(shí)別實(shí)戰(zhàn)教程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-08-08

