Python 为什么“max”和“min”对numpy.nan有如此奇怪的行为?

Python 为什么“max”和“min”对numpy.nan有如此奇怪的行为?,python,python-3.x,max,nan,min,Python,Python 3.x,Max,Nan,Min,我不小心在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 我已经使用了很多值,似乎第一个给定的值总是返回的值。使

我不小心在
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
我已经使用了很多值,似乎第一个给定的值总是返回的值。使用
min
可以观察到相同的行为。我本来希望输出总是
nan
,甚至抛出一个错误,但这是完全出乎意料的
Math.nan
做同样的事情


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

编写自己版本的
max
。请记住,
NaN
将导致任何较大、相等或较小的比较返回
False
。比如说,

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

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

numpy.max
的行为更合理:

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

@sascha他正在调用标准Python
min
max
,他的论点对此很有意义。这里没有具体的numpy。对于
math.nan
,或
decimal.decimal('nan')
,或任何遵循定义的nan语义的操作,都会得到相同的行为。(好的,
Decimal
numpy
允许您为NaN行为配置IEEE样式的标志,并且默认情况下您正在使用信令NaN,因此您可以使其升高,例如,
invalidooperation
来自
Decimal
)您甚至可以使用与NaN不同的语义创建一个完全不同的类型,除非它们定义了一个“安静”的偏序,并产生了类似的奇怪之处。
>>> numpy.maximum(numpy.nan, 1)
nan
>>> numpy.maximum(1, numpy.nan)
nan