为什么`max`和`min`在numpy.nan中有这么奇怪的行为?

时间:2018-04-04 00:01:20

标签: python python-3.x max nan min

我不小心偶然发现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做同样的事情。

我对这种行为很好奇 - 有没有人有任何想法?

2 个答案:

答案 0 :(得分:8)

编写您自己的max版本。请注意,NaN会导致任何更大,相等或更少的比较返回False。例如,

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

当您以数字开头时,比较失败,并且该数字成为结果。当您从nan开始时,任何比较都会失败,结果会停留在初始nan值。

它并不总是第一个值,只是你用上述机制获得的值。例如:

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

答案 1 :(得分:2)

max对浮点数或NaN一无所知。它假定参数之间实际存在排序关系,并且当没有这种关系时它可能产生无意义的结果,就像NaN的情况一样。

numpy.maximum表现得更合理:

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