Python 为什么NaN值使最小值和最大值对顺序敏感?

Python 为什么NaN值使最小值和最大值对顺序敏感?,python,numpy,nan,Python,Numpy,Nan,(相同的行为发生在max) 我知道我可以通过使用numpy.nanmin来避免这种行为。但是,当顺序颠倒时,是什么导致了这种变化呢?min对输入顺序敏感吗?是nan会破坏正确的顺序,因为它总是比较为False。很多事情与nan不一致: > import numpy as np > min(50, np.NaN) 50 > min(np.NaN, 50) nan [2]中的:3.0

(相同的行为发生在
max


我知道我可以通过使用
numpy.nanmin
来避免这种行为。但是,当顺序颠倒时,是什么导致了这种变化呢?
min
对输入顺序敏感吗?

nan
会破坏正确的顺序,因为它总是比较为
False
。很多事情与
nan
不一致:

> import numpy as np

> min(50, np.NaN)
50   
> min(np.NaN, 50)
nan
[2]中的
:3.0
min
max
只能为您提供一致的结果,说明您正在使用定义良好的排序,如果您可以使用
nan

min对输入顺序是否敏感

如果多个项目最少,函数将返回遇到的第一个项目

文档中没有明确说明如何在顺序不一致的项目中定义“最小值”,但很可能最小值是基于元素上的循环,并使用<运算符确定新元素是否小于迄今为止发现的最小项目

为了证实这一假设,我们可以阅读源代码(搜索内置的min和min_max in),这有点让人困惑,因为min和max的实现是组合的,变量名似乎基于它是max函数,但这并不难理解

它确实会按顺序循环元素,并通过调用PyObject_richcomarebool和Py_LT的“opid”来执行比较,Py_LT是python<操作符的C API等价物


NaN和数字之间的比较返回false,因此在包含数字和NaN的列表中,如果第一个位置有一个NaN,它将被视为最小值,因为没有任何数字会“小于”它。另一方面,如果NaN不在第一个位置,则它将被有效跳过,因为它不“小于”任何数字。

并且,如果您不知道数据集中存在
NaN
,则
min(我的原始列表)
min(我的排序列表)
可能不同,我想?这种行为背后的原因很可能是因为它假设(x=y)。这对NaN不起作用。请注意,
np.min
更为一致:
np.min([2,np.NaN]),np.min([np.NaN,2.])
两者都返回
NaN
这就引出了一个问题,即在比较方面究竟如何定义min和max。我们可以推断,它定义为C++ >代码> STD::MIN <代码>,像<代码> A< B?a:b。有关
min
NaN
的具体情况,请参见,与可靠执行NaN传播的
fmin
等C函数相反,如果输入为NaN,则始终给出NaN。@PeterCordes它可能是以“幼稚”的方式实现的,但请注意,
min
适用于任意对象的任意可写性,并且可能没有为特殊的大小写
float
对象,甚至特别是数字对象做任何规定。它以一种明显的方式实现,一个与python<操作符相当的C API循环。特定类型的处理由上述操作符实现。
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