【发布时间】:2017-01-05 13:35:46
【问题描述】:
在涉及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
我猜这可能是与返回False 的NaN 值进行任何比较的副作用,但是当您“碰巧”有时会在你的阵列。 np.nanmin 或 np.nanargmin 的使用感觉像是一种快速修复,以某种方式固定在现有行为之上。
除了docs 中的注释:“传播 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 是否被安静地处理。 Numpy 安静地对待。