[英]Why is `NaN` considered “smaller” than `-np.inf` in numpy?
在涉及np.min
或np.argmin
任何比較中, NaN
小於-np.inf
的原因是什么?
import numpy as np
In [73]: m = np.array([np.nan, 1., 0., -np.inf])
In [74]: n = np.array([-np.inf, 1., 0., np.nan])
# Huh??
In [75]: np.min(m)
Out[75]: nan
In [76]: np.min(n)
Out[76]: nan
# Same for np.argmin
In [77]: np.argmin(m)
Out[77]: 0
In [78]: np.argmin(n)
Out[78]: 3
# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False
In [80]: np.nan > -np.inf
Out[80]: False
# OK, that seems to fix it, but its not necessarily elegant
In [81]: np.nanmin(m)
Out[81]: -inf
In [82]: np.nanargmin(m)
Out[82]: 3
我想這可能與NaN
值返回False
的任何比較的副作用,但是當您“碰巧”有時以數組中的NaN
值結尾時,這種恕我直言會帶來一些相當煩人的效果。 np.nanmin
或np.nanargmin
的使用有些感覺像是在現有行為基礎上以某種方式添加的np.nanmin
np.nanargmin
。
除了文檔中的注釋外:“ 傳播NaN值,也就是說,如果至少一項是NaN,則相應的最小值也將是NaN。要忽略NaN值(MATLAB行為),請使用nanmin。找不到解釋這種行為背后原因的任何東西。這是想要的還是NaN
值的特定內部表示的副作用?為什么?
正如@Dunno在評論中提到的,將NaN與數字進行比較並沒有太多意義,因此這種行為可能是可以的。 IEEE 754標准說明了將NaN與數字進行比較的方法:
可能存在四種互斥關系:小於,相等,大於和無序。 當至少一個操作數為NaN時,出現最后一種情況。 每個NaN都應將無序與所有事物(包括自身)進行比較
根據標准,這是:
# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False
將導致“無序”結果,因此它屬於“小於”關系是不正確的。
因此,您可能已經知道:
“ inf”是無窮大-一個大於任何其他值的值。 因此,“-inf”小於任何其他值。請記住,該值是一個數字。
“ nan”表示不是數字。
因此,如果根據您在上面聲明的數組“ m,n”以及一旦對其中任何一個執行“ np.min()”,實際上發生的就是在遇到“ nan”時其他元素就不會檢查或比較並執行以下語句並返回值:
if (@isnan@(mp)) { /* nan encountered; it's maximal */ return 0; }
因此返回“ nan”作為函數的答案!
檢查此代碼,遇到第一個“ nan”后立即返回,並在相應函數中返回其位置
In [1]: import numpy as np
In [2]: m = np.array([1., 0., -np.inf, np.nan])
In [3]: n = np.array([np.nan, 1., np.nan, 0.])
In [4]: np.argmin(m)
Out[4]: 3
In [5]: np.argmin(n)
Out[5]: 0
並且“ np.nan <-np.inf”和“ np.nan> -np.inf”之類的操作返回“ False”,因為“ nan”在此處不能與任何數字“ -inf”和“ False”進行比較在上述每種情況下,操作都不是比較的答案,而是由於一種異常或上述代碼的執行,這是由於邏輯錯誤而引起的,因為盡管無窮大,但相對於“無”而言到一個數字!
因此,如果刪除數組中的所有“ nan”,然后通過“ np.nanmin()”計算min,則輸出將如預期的那樣-inf,這不會出現問題!
因此,“ Nan”不小於或大於“ inf”或“ -inf”,因為實際上它與任何這些數字或任何數字都不可比,與任何數字相比,它將返回“ False”!
In [1]: np.nan < 1
Out[1]: False
In [2]: np.nan > 1
Out[2]: False
等等 ...............
希望能幫助到你 !!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.