在涉及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