为什么 `max` 和 `min` 与 numpy.nan 有如此奇怪的行为?
Why do `max` and `min` have such strange behavior with numpy.nan?
我无意中发现了 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
将导致与 return False
的任何更大、相等或更小的比较。例如,
def my_max(iter):
result = iter[0]
for val in iter[1:]:
if result < val:
result = val
return result
当您以数字开头时,比较失败,该数字成为结果。当您从 nan
开始时,any 比较失败,结果停留在初始 nan
值。
它并不总是第一个值,而是您通过上述机制获得的值。例如:
>>> nan = numpy.nan
>>> max([7, nan, 15, nan, 5])
15
>>> max([nan, 7, nan, 15, nan, 5])
nan
max
对浮点数或 NaN 一无所知。它假定参数之间实际上存在顺序关系,并且当没有这种关系时可能会产生无意义的结果,例如 NaN。
numpy.maximum
行为更合理:
>>> numpy.maximum(numpy.nan, 1)
nan
>>> numpy.maximum(1, numpy.nan)
nan
我无意中发现了 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
将导致与 return False
的任何更大、相等或更小的比较。例如,
def my_max(iter):
result = iter[0]
for val in iter[1:]:
if result < val:
result = val
return result
当您以数字开头时,比较失败,该数字成为结果。当您从 nan
开始时,any 比较失败,结果停留在初始 nan
值。
它并不总是第一个值,而是您通过上述机制获得的值。例如:
>>> nan = numpy.nan
>>> max([7, nan, 15, nan, 5])
15
>>> max([nan, 7, nan, 15, nan, 5])
nan
max
对浮点数或 NaN 一无所知。它假定参数之间实际上存在顺序关系,并且当没有这种关系时可能会产生无意义的结果,例如 NaN。
numpy.maximum
行为更合理:
>>> numpy.maximum(numpy.nan, 1)
nan
>>> numpy.maximum(1, numpy.nan)
nan