为什么 `max` 和 `min` 与 numpy.nan 有如此奇怪的行为?

Why do `max` and `min` have such strange behavior with numpy.nan?

我无意中发现了 maxminnumpy.nan 的一些奇怪行为,我很好奇幕后发生的事情。

考虑 python3 中的以下代码 运行:

import numpy as np

max(np.nan, 0)     # outputs nan 
max(np.nan, 10000) # outputs nan
max(0, np.nan)     # outputs 0
max(10000, np.nan) # outputs 10000

我试过很多值,似乎第一个给出的值总是返回值。使用 min 可以观察到相同的行为。我本来希望输出始终为 nan,甚至会引发错误,但这是非常出乎意料的。 Math.nan 做同样的事情。

我对这种行为很好奇 -- 有人有什么想法吗?

编写您自己的 max 版本。请记住,NaN 将导致与 return False 的任何更大、相等或更小的比较。例如,

def my_max(iter):
    result = iter[0]
    for val in iter[1:]:
        if result < val:
            result = val
    return result

当您以数字开头时,比较失败,该数字成为结果。当您从 nan 开始时,any 比较失败,结果停留在初始 nan 值。

它并不总是第一个值,而是您通过上述机制获得的值。例如:

>>> nan = numpy.nan
>>> max([7, nan, 15, nan, 5])
15
>>> max([nan, 7, nan, 15, nan, 5])
nan

max 对浮点数或 NaN 一无所知。它假定参数之间实际上存在顺序关系,并且当没有这种关系时可能会产生无意义的结果,例如 NaN。

numpy.maximum行为更合理:

>>> numpy.maximum(numpy.nan, 1)
nan
>>> numpy.maximum(1, numpy.nan)
nan