> import numpy as np
> min(50, np.NaN)
50
> min(np.NaN, 50)
nan
Run Code Online (Sandbox Code Playgroud)
(相同的行为发生在max)
我知道我可以通过使用numpy.nanmin. 但是当顺序颠倒时,是什么导致了变化呢?是min输入顺序敏感?
jua*_*aga 16
Yesnan破坏了正确的排序,因为它总是比较为False. 很多东西nan都不一致:
In [2]: 3.0 < float('nan')
Out[2]: False
In [3]: float('nan') < 3.0
Out[3]: False
In [4]: float('nan') == 3.0
Out[4]: False
Run Code Online (Sandbox Code Playgroud)
min并且max只能为您提供一致的结果,表明您正在使用明确定义的排序,如果可以的话,哪些数字类型不是nan
plu*_*ash 15
min 对输入顺序敏感吗?
是的。
https://docs.python.org/3/library/functions.html#min
“如果多个项目最少,则该函数返回遇到的第一个项目。”
该文档没有具体说明在面对没有一致顺序的项目时如何定义“最小”,但 min 很可能基于循环元素并使用 < 运算符来确定新元素是否是小于迄今为止发现的最小项目。
为了证实这个假设,我们可以阅读源代码(在https://github.com/python/cpython/blob/c96d00e88ead8f99bb6aa1357928ac4545d9287c/Python/bltinmodule.c 中搜索 builtin_min 和 min_max ),这有点令人困惑,因为 min 和 max 的实现组合在一起,变量名似乎基于它是一个 max 函数,但并不难理解。
它确实按顺序循环遍历元素,并使用 Py_LT 的“opid”调用 PyObject_RichCompareBool 执行比较,Py_LT 是 Python < 运算符的 C API 等效项。
NaN 和数字之间的比较返回 false,因此在包含数字和 NaN 的列表中,如果第一个位置有 NaN,它将被视为最小值,因为没有数字会“小于”它。另一方面,如果 NaN 不在第一个位置,那么它将被有效地跳过,因为它不“小于”任何数字。