为什么要考虑`NaN`"更小"在numpy中比`-np.inf`?

时间:2017-01-05 13:35:46

标签: python numpy nan

在涉及NaN-np.inf的任何比较中,np.min被视为低于np.argmin的原因是什么?

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

我猜这可能是与NaNFalse返回NaN的任何比较的副作用,但是当你&#34;发生时,这会产生一些相当恼人的影响。有时在数组中以np.nanmin值结束。 np.nanargminNaN的使用感觉就像是一个以现有行为为基础的摩托车。

除了docs中的注释:&#34; 传播NaN值,即如果至少有一个项目是NaN,则相应的最小值也将是NaN。要忽略NaN值(MATLAB行为),请使用nanmin。,我还没有找到任何解释该行为背后的基本原理的东西。这是否需要或SQL Server值的特定内部表示的副作用?为什么?

2 个答案:

答案 0 :(得分:5)

正如@Dunno在评论中提到的那样,将NaN与数字进行比较没有多大意义,所以这种行为可能没问题。 IEEE 754标准说明了将NaN与数字进行比较:

  

四种相互排斥的关系是可能的:小于,等于,大于和无序。最后一个案例   当至少一个操作数是NaN时出现。每个NaN都会将无序与一切进行比较,包括   本身

根据标准:

# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False

会导致“无序”结果,因此它不属于“小于”的关系。

答案 1 :(得分:0)

所以,你可能已经知道了这一点: -

&#34; inf&#34;是无穷大 - 一个大于任何其他值的值。 &#34; -inf&#34;因此,小于任何其他值,请记住此值是一个数字。

&#34; nan&#34;代表不是数字。

所以,如果根据你的阵列&#34; m,n&#34;正如您在上面所声明的那样,并且只要您执行&#34; np.min()&#34;实际上发生的事情就是#34; nan&#34;遇到其他元素未被检查或比较,并执行以下语句并返回值:

 if (@isnan@(mp)) { /* nan encountered; it's maximal */ return 0; } 

因此&#34; nan&#34;作为函数的答案返回!

检查此代码,只要遇到第一个&#34; nan&#34;并且它的位置在相应的函数中返回

    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

以及&#34;等操作np.nan&lt; -np.inf&#34;和&#34; np.nan&gt; -np.inf&#34;返回&#34;错误&#34;因为&#34; nan&#34;无法通过任何数字进行比较&#34; -inf&#34;这里和&#34;错误&#34;在上述操作的每种情况下都不是比较的答案,而是由于一种异常或上面提到的代码的执行,这是由于逻辑错误,因为虽然无穷但却无法与事物进行比较。什么都没有&#34;关于一个数字!

因此,如果你删除所有&#34; nan&#34;在数组中,然后通过&#34; np.nanmin()&#34;你得到了预期的输出&#34; -inf&#34;这里没有问题!

因此,&#34; Nan&#34;不小于或大于&#34; inf&#34;或&#34; -inf&#34;因为实际上它不能与任何这些或任何数字相比,它将返回&#34;错误&#34;与任何数字相比!!

    In [1]: np.nan < 1
    Out[1]: False

    In [2]: np.nan > 1
    Out[2]: False

依此类推...............

希望它有所帮助!!