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

Pet*_*lan 3 python max nan min python-3.x

我不小心偶然发现了一些奇怪的行为max,min而且numpy.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
Run Code Online (Sandbox Code Playgroud)

我玩了很多值,似乎给出的第一个值总是返回的值.可以观察到相同的行为min.我本来期望输出一直是nan,甚至是抛出一个错误,但这是非常意外的.Math.nan做同样的事情.

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

Pru*_*une 8

写你自己的版本max.请记住,这NaN将导致任何更大,相等或更少的比较返回False.例如,

def my_max(iter):
    result = iter[0]
    for val in iter[1:]:
        if result < val:
            result = val
    return result
Run Code Online (Sandbox Code Playgroud)

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

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

>>> nan = numpy.nan
>>> max([7, nan, 15, nan, 5])
15
>>> max([nan, 7, nan, 15, nan, 5])
nan
Run Code Online (Sandbox Code Playgroud)