3

使用我无法理解的 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(这是导致 and3 不起作用的原因);奇怪的v[1] is nanTrue

是什么导致了这种行为?如何在我的and3函数中正确使用 nan 值?

4

2 回答 2

5

nan不应用作 a 的索引,dict因为它不能成功地与自身进行比较。

>>> float('nan') == float('nan')
False
>>> numpy.nan == numpy.nan
False

但是,nan可以使用以下方法检测math.isnan()

>>> math.isnan(numpy.nan)
True
于 2013-07-11T17:55:22.687 回答
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此外,属性查找比局部变量查找要慢,因此将其定义为默认参数会比将其设为函数属性获得更好的性能。您不必在函数之外定义它,而且它也更容易阅读。

于 2013-07-11T18:14:46.260 回答