java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?
在涉及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的使用感覺就像是一種快速修復程序,該修復程序以某種方式裝訂在現有行為之上。
除了文檔中的注釋外:"傳播NaN值,也就是說,如果至少一項是NaN,則相應的最小值也將是NaN。要忽略NaN值(MATLAB行為),請使用nanmin。 沒有找到任何能解釋該行為背后原因的信息。這是通緝還是NaN值的特定內部表示的副作用?為什么?
您可能會發現此答案很有幫助:stackoverflow.com/questions/1565164/
這是一種邏輯行為:如果某物不是數字,則無法將其與是數字的任何東西進行比較,因此,任何比較均返回false。 不僅如此-人們可以說在大多數情況下,NaN不是某些操作的理想結果,因此它應該像其他任何異常一樣傳播。
請參閱最近的答案stackoverflow.com/a/41324751/901925。 在此功能和相關功能中,NaN被顯式編碼為maximal。
您的前提不正確。 np.nan對于任何其他數字(包括它自己)都是無序的,不會引發錯誤。 雖然小于,但它也大于且不等于任何其他數字-包括其自身。 這是IEEE 754的一部分。實現細節是如果用信號處理NaN或安靜地處理NaN。 脾氣暴躁的對待安靜。
正如@Dunno在評論中提到的,將NaN與數字進行比較并沒有太多意義,因此這種行為可能是可以的。 IEEE 754標準說明了將NaN與數字進行比較的方法:
Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case
arises when at least one operand is NaN. Every NaN shall compare unordered with everything, including
itself
根據標準,這是:
# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False
將導致"無序"結果,因此它屬于"小于"關系是不正確的。
該解釋的問題在于,Python中沒有"無序"類別,因此np.nan < 5,np.nan > 5和np.nan == 5不能全部求和為False,但是它們確實是。 如果您開始在常規Python語句中使用np.nan,則將引起各種麻煩。 例如:min([5, np.nan])-> 5,而min([np.nan, 5])-> np.nan。 我想知道為什么np.nan支持比較并且不會像None那樣引發TypeError。
因此,您可能已經知道:
" 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"之類的操作返回" 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
等等 ...............
希望能幫助到你 !!
從技術上講,numpy c代碼不會引發異常,它只會返回。 if (@isnan@(mp)) { * nan encountered; its maximal * return 0; }。 stackoverflow.com/questions/41320568/
是的,通過引發異常,我的意思是,一旦遇到" nan",我便停止了正常執行,我不知道謝謝@hpaulj
總結
以上是生活随笔為你收集整理的java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python博客源码下载_Python生
- 下一篇: PXF webapp is inacce