簡體   English   中英

為什么numpy中的“ NaN”比“ -np.inf”“小”?

[英]Why is `NaN` considered “smaller” than `-np.inf` in numpy?

在涉及np.minnp.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.nanminnp.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.

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