在涉及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
我猜这可能是与NaN
值False
返回NaN
的任何比较的副作用,但是当你&#34;发生时,这会产生一些相当恼人的影响。有时在数组中以np.nanmin
值结束。 np.nanargmin
或NaN
的使用感觉就像是一个以现有行为为基础的摩托车。
除了docs中的注释:&#34; 传播NaN值,即如果至少有一个项目是NaN,则相应的最小值也将是NaN。要忽略NaN值(MATLAB行为),请使用nanmin。,我还没有找到任何解释该行为背后的基本原理的东西。这是否需要或SQL Server
值的特定内部表示的副作用?为什么?
答案 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
依此类推...............
希望它有所帮助!!