当使用我无法理解的numpy.nan时,我遇到了一种奇怪的行为。 这是一个最小的例子:
from numpy import nan
def _bool3key(x):
"""
Defines the keys used to order the list.
The only allowed values are True, False, 1,0 and numpy.nan.
"""
return _bool3key.__logic_sort__[x]
_bool3key.__logic_sort__ = {0:-1, nan:0 , 1:1}
def and3(*args):
return min(*args,key=_bool3key)
def f(x):
"""long function that produces in output a vector containing only 0, nan and 1s.
pass #
有时候and3函数会失败,尽管在f(x)返回的向量中只有0,nan或1值:原因是nan不是numpy.nan ...
例如v = f(x)
生成了一个向量[nan,nan]
。但是,如果我尝试输入:
v[0] is nan
我得False
(这是导致什么原因而不是工作的原因);但奇怪的是v[1] is nan
是True
。
导致此行为的原因是什么?如何在and3
函数中正确使用nan值
答案 0 :(得分:5)
nan
不应该用作dict
的索引,因为它无法与自身成功比较。
>>> float('nan') == float('nan')
False
>>> numpy.nan == numpy.nan
False
但是,可以使用math.isnan()
检测nan
:
>>> math.isnan(numpy.nan)
True
答案 1 :(得分:3)
如果您使用
_bool3key.__logic_sort__ = {0:-1, nan:0 , 1:1}
然后您可能遇到的一个问题是,float('nan')
无法识别为与np.nan
相同的密钥:
In [17]: _bool3key(float('nan'))
KeyError: nan
这是一种解决方法:
def _bool3key(x, logic_sort={0: -1, 1: 1}):
"""
Defines the keys used to order the list.
The only allowed values are True, False, 1,0 and nan.
"""
return 0 if np.isnan(x) else logic_sort[x]
此外,属性查找比局部变量查找慢,所以
定义logic_sort
作为默认参数比将其设为函数属性稍微好一些。您不必在函数之外定义它,也可以更容易阅读。