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(我的排序列表)
可能不同,我想?这种行为背后的原因很可能是因为它假设(xnp.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