什么原因NaN被认为比-np.inf任何涉及np.min或比较的比较少np.argmin?
import numpy as np
In [73]: m = np.array([np.nan, 1., 0., -np.inf])
In [74]: n = np.array([-np.inf, 1., 0., np.nan])
# Huh??
In [75]: np.min(m)
Out[75]: nan
In [76]: np.min(n)
Out[76]: nan
# Same for np.argmin
In [77]: np.argmin(m)
Out[77]: 0
In [78]: np.argmin(n)
Out[78]: 3
# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False
In [80]: np.nan > -np.inf
Out[80]: False
# OK, that seems to fix it, but its not necessarily elegant
In [81]: np.nanmin(m)
Out[81]: -inf
In [82]: np.nanargmin(m)
Out[82]: 3
Run Code Online (Sandbox Code Playgroud)
我猜它可能是与NaN值返回的任何比较的副作用False,但是当你"发生"有时最终得到NaN你的数组中的值时,这个imho会导致一些相当恼人的效果.使用np.nanmin或np.nanargmin某些感觉就像一个quickfix,以某种方式钉在现有行为之上.
除了文档中的那个注释:" NaN值被传播,即如果至少有一个项目是NaN,相应的最小值也将是NaN.要忽略NaN值(MATLAB行为),请使用nanmin.,我没有找不到任何可以解释这种行为背后的基本原理的东西.这是否需要或某种特定内部NaN价值观的副作用?为什么?
正如@Dunno在评论中提到的那样,将NaN与数字进行比较没有多大意义,所以这种行为可能没问题.IEEE 754标准说明了将NaN与数字进行比较:
四种相互排斥的关系是可能的:小于,等于,大于和无序.当至少一个操作数是NaN时,出现最后一种情况.每个NaN都应该将无序与包括其自身在内的所有东西进行比较
根据标准:
# Its all false!
In [79]: np.nan < -np.inf
Out[79]: False
Run Code Online (Sandbox Code Playgroud)
会导致"无序"结果,因此它不属于"小于"的关系.