哈希对象中的numpy.nan奇怪的行为

时间:2013-07-11 17:34:49

标签: python numpy nan

当使用我无法理解的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 nanTrue

导致此行为的原因是什么?如何在and3函数中正确使用nan值

2 个答案:

答案 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作为默认参数比将其设为函数属性稍微好一些。您不必在函数之外定义它,也可以更容易阅读。