标准Min函数未与nan给出一致答案

时间:2019-03-04 04:46:39

标签: python python-3.x min

我无法理解min函数的行为。当nan是第一个元素时,min表示nan是min元素;如果nan不是第一个元素,它将在列表中给出实际的最小值。

为什么我在这里得到不同的答案?

>>> min([float('nan'),10,2,0])
nan

>>> min([10,float('nan'),2,0])
0

1 个答案:

答案 0 :(得分:2)

这是因为与NaN相比,任何实数都是False,并且在逻辑上,min的实现等效于:

def min(seq):
    minimum, *rest = seq
    for i in rest:
        if i < minimum:
            minimum = i
    return minimum

如果列表的第一项为NaN,则列表中的其他任何项都不能认为比NaN小,因为任何i < float('nan')False。另一方面,如果第一项不是NaN,则NaN不可能被认为是最小的,因为任何float('nan') < iFalse

如果您希望min忽略NaN,则可以使用键函数将其映射到无穷大:

from math import isnan
print(min([float('nan'),10,2,0], key=lambda i: float('inf') if isnan(i) else i))
print(min([10,float('nan'),2,0], key=lambda i: float('inf') if isnan(i) else i))

这将输出:

0
0