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