为什么 `NaN` 在 numpy 中被认为是 "smaller" 而不是 `-np.inf`?

Why is `NaN` considered "smaller" than `-np.inf` in numpy?

在任何涉及 np.minnp.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 的副作用,但是当您 "happen" 有时结束时,这个恕我直言会导致一些相当烦人的效果在数组中添加一个 NaN 值。 np.nanminnp.nanargmin 的使用感觉像是一种快速修复,以某种方式固定在现有行为之上。

除了 docs 中的注释:“NaN 值被传播,也就是说,如果至少有一个项目是 NaN,则相应的最小值也将是 NaN。忽略NaN 值(MATLAB 行为),请使用 nanmin。,我还没有找到任何解释该行为背后的基本原理的信息。这是需要的还是 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

会导致 "unordered" 结果,因此它属于关系 "less than".

是不正确的

因此,您可能已经知道这一点:-

" inf " 是无穷大 - 一个大于任何其他值的值。因此,“ -inf ”小于任何其他值,请记住该值是一个数字。

“nan”代表非数字。

因此,如果根据您在上面声明的数组“m,n”,并且一旦您对其中任何一个执行“np.min()”,实际上发生的是“nan”遇到其他元素未检查或比较并执行以下语句并且值为 returned:

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

因此“nan”被return编辑为函数的答案!

检查这段代码 return 遇到第一个 " nan " 并且它的位置 return 在相应的函数中

    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”和“np.nan > -np.inf”之类的操作 returns “假”因为“ nan”不能与任何数字“-inf”在这里进行比较,并且上述操作中每种情况下的“False”都不是比较的答案,而是因为一种异常或上述代码的执行是由于逻辑错误,因为虽然无穷大但它不能与关于数字的“无”事物进行比较!

因此,如果您删除数组中的所有“nan”,然后通过“np.nanmin()”计算最小值,您将获得预期的输出“-inf”,这里不会出现任何问题!

所以,"Nan "is not smaller or greater than " inf" 或 "-inf" 因为实际上它无法与任何这些或任何数字进行比较,所以与任何数字相比它将 return "False"! !

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

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

等等......

希望对您有所帮助!!