为什么 `NaN` 在 numpy 中被认为是 "smaller" 而不是 `-np.inf`?
Why is `NaN` considered "smaller" than `-np.inf` in numpy?
在任何涉及 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
的副作用,但是当您 "happen" 有时结束时,这个恕我直言会导致一些相当烦人的效果在数组中添加一个 NaN
值。 np.nanmin
或 np.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
等等......
希望对您有所帮助!!
在任何涉及 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
的副作用,但是当您 "happen" 有时结束时,这个恕我直言会导致一些相当烦人的效果在数组中添加一个 NaN
值。 np.nanmin
或 np.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
等等......
希望对您有所帮助!!