numpy.asarray(...)"为什么"无导致未来的警告

时间:2015-02-05 05:54:25

标签: python numpy

当您执行以下操作时,将来会发出警告:

>>> numpy.asarray([1,2,3,None]) == None

目前返回False,但据我所知,将在Numpy的未来版本中返回包含[False,False,False,True]的数组。

正如所讨论的那样on the numpy discussion list,解决这个问题的方法是测试a is None

让我感到困惑的是{1}数组与{1}数组的行为与列表相比:

in

编辑(见评论) - 实际上有两个不同的问题:

  1. 为什么会导致>>> None in [1,2,3,None] True >>> None in numpy.asarray([1,2,3,None]) __main__:1: FutureWarning: comparison to 'None' will result in an elementwise object comparison in the future False >>> 1 in numpy.asarray([1,2,3,None]) True - 将FutureWarning的未来行为与现在的行为进行比较?
  2. 为什么None in numpy.asarray(...)in的行为有所不同;我可以测试我的数组是否包含list而不将其转换为列表或使用None循环吗?
  3. Numpy版本是1.9.1,Python 3.4.1

1 个答案:

答案 0 :(得分:7)

  

当您执行以下操作时,将来会发出警告:

numpy.asarray([1,2,3,4]) == None
     

目前返回False,但据我所知,将在Numpy的未来版本中返回包含[False,False,False,True]的数组。

正如我在评论中提到的,您的示例不正确。 numpy的未来版本将返回[False ,False, False, False],即False,表示数组中的每个元素不等于None。这与当前有效的其他标量值的元素比较更为一致,例如:

In [1]: np.array([1, 2, 3, 4]) == 1
Out[1]: array([ True, False, False, False], dtype=bool)

In [2]: np.array(['a', 'b', 'c', 'd']) == 'b'
Out[2]: array([False,  True, False, False], dtype=bool)
  

让我感到困惑的是{1}数组与{1}数组相比,列表

的行为

当您测试in时,您正在呼叫x in y。当y.__contains__(x)是一个列表时,y基本上可以做到这一点:

__contains__

据我所知,for item in y: if (item is x) or (item == x): return True return False 执行的相当于:

np.ndarray.__contains__(x)

也就是说它首先测试整个数组的元素相等(if any(y == x): return True else: return False 是一个大小为y == x的布尔数组)。因为在您的情况下,您正在测试是否y,由于上述原因,这会引发y == None

在评论中你也想知道为什么

FutureWarning

返回np.nan in np.array([1, 2, 3, np.nan]) ,但

False

返回np.nan in [1, 2, 3, np.nan] 。第一部分很容易通过Truesee here for the rationale behind this)这一事实来解释。要理解第二种情况返回np.nan != np.nan的原因,请记住True在检查相等性(list.__contains__())之前首先检查身份(is)。自==起,第二种情况将返回np.nan is np.nan