java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?
在涉及np.min或np.argmin的任何比較中,認(rèn)為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的任何比較產(chǎn)生副作用,但是當(dāng)您"偶然"有時(shí)在數(shù)組中最終以NaN值結(jié)尾時(shí),這種恕我直言會(huì)帶來一些相當(dāng)煩人的效果。 np.nanmin或np.nanargmin的使用感覺就像是一種快速修復(fù)程序,該修復(fù)程序以某種方式裝訂在現(xiàn)有行為之上。
除了文檔中的注釋外:"傳播NaN值,也就是說,如果至少一項(xiàng)是NaN,則相應(yīng)的最小值也將是NaN。要忽略NaN值(MATLAB行為),請(qǐng)使用nanmin。 沒有找到任何能解釋該行為背后原因的信息。這是通緝還是NaN值的特定內(nèi)部表示的副作用?為什么?
您可能會(huì)發(fā)現(xiàn)此答案很有幫助:stackoverflow.com/questions/1565164/
這是一種邏輯行為:如果某物不是數(shù)字,則無法將其與是數(shù)字的任何東西進(jìn)行比較,因此,任何比較均返回false。 不僅如此-人們可以說在大多數(shù)情況下,NaN不是某些操作的理想結(jié)果,因此它應(yīng)該像其他任何異常一樣傳播。
請(qǐng)參閱最近的答案stackoverflow.com/a/41324751/901925。 在此功能和相關(guān)功能中,NaN被顯式編碼為maximal。
您的前提不正確。 np.nan對(duì)于任何其他數(shù)字(包括它自己)都是無序的,不會(huì)引發(fā)錯(cuò)誤。 雖然小于,但它也大于且不等于任何其他數(shù)字-包括其自身。 這是IEEE 754的一部分。實(shí)現(xiàn)細(xì)節(jié)是如果用信號(hào)處理NaN或安靜地處理NaN。 脾氣暴躁的對(duì)待安靜。
正如@Dunno在評(píng)論中提到的,將NaN與數(shù)字進(jìn)行比較并沒有太多意義,因此這種行為可能是可以的。 IEEE 754標(biāo)準(zhǔn)說明了將NaN與數(shù)字進(jìn)行比較的方法:
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
根據(jù)標(biāo)準(zhǔn),這是:
# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False
將導(dǎo)致"無序"結(jié)果,因此它屬于"小于"關(guān)系是不正確的。
該解釋的問題在于,Python中沒有"無序"類別,因此np.nan < 5,np.nan > 5和np.nan == 5不能全部求和為False,但是它們確實(shí)是。 如果您開始在常規(guī)Python語句中使用np.nan,則將引起各種麻煩。 例如:min([5, np.nan])-> 5,而min([np.nan, 5])-> np.nan。 我想知道為什么np.nan支持比較并且不會(huì)像None那樣引發(fā)TypeError。
因此,您可能已經(jīng)知道:
" inf"是無窮大-一個(gè)大于任何其他值的值。因此,"-inf"小于任何其他值。請(qǐng)記住,該值是一個(gè)數(shù)字。
" nan"表示不是數(shù)字。
因此,如果根據(jù)您在上面聲明的數(shù)組" m,n"以及一旦對(duì)其中任何一個(gè)執(zhí)行" np.min()",實(shí)際上發(fā)生的就是在遇到" nan"時(shí)其他元素就不會(huì)檢查或比較并執(zhí)行以下語句并返回值:
if (@isnan@(mp)) { /* nan encountered; it's maximal */ return 0; }
因此返回" nan"作為函數(shù)的答案!
檢查此代碼,遇到第一個(gè)" nan"后立即返回,并在相應(yīng)函數(shù)中返回其位置
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",因?yàn)榇颂?#34; nan"不能與任何數(shù)字" -inf"和" False"進(jìn)行比較在上述每種情況下,操作都不是比較的答案,而是由于一種異常或上述代碼的執(zhí)行,這是由于邏輯錯(cuò)誤而引起的,因?yàn)楸M管無窮大,但相對(duì)于"無"而言到一個(gè)數(shù)字!
因此,如果刪除數(shù)組中的所有" nan",然后通過" np.nanmin()"計(jì)算min,則輸出將如預(yù)期的那樣-inf,這不會(huì)出現(xiàn)問題!
因此," Nan"不小于或大于" inf"或" -inf",因?yàn)閷?shí)際上它與任何這些數(shù)字或任何數(shù)字都不可比,與任何數(shù)字相比,它將返回" False"!
In [1]: np.nan < 1
Out[1]: False
In [2]: np.nan > 1
Out[2]: False
等等 ...............
希望能幫助到你 !!
從技術(shù)上講,numpy c代碼不會(huì)引發(fā)異常,它只會(huì)返回。 if (@isnan@(mp)) { * nan encountered; its maximal * return 0; }。 stackoverflow.com/questions/41320568/
是的,通過引發(fā)異常,我的意思是,一旦遇到" nan",我便停止了正常執(zhí)行,我不知道謝謝@hpaulj
總結(jié)
以上是生活随笔為你收集整理的java难学还是pythonnanxue_关于python:为什么numpy中的“ NaN”比“ -np.inf”更小?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python博客源码下载_Python生
- 下一篇: PXF webapp is inacce