我不小心偶然发现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
做同样的事情。
我对这种行为很好奇 - 有没有人有任何想法?
答案 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