当您执行以下操作时,将来会发出警告:
>>> numpy.asarray([1,2,3,None]) == None
目前返回False
,但据我所知,将在Numpy的未来版本中返回包含[False,False,False,True]
的数组。
正如所讨论的那样on the numpy discussion list,解决这个问题的方法是测试a is None
。
让我感到困惑的是{1}数组与{1}数组的行为与列表相比:
in
编辑(见评论) - 实际上有两个不同的问题:
>>> 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
的未来行为与现在的行为进行比较?None in numpy.asarray(...)
与in
的行为有所不同;我可以测试我的数组是否包含list
而不将其转换为列表或使用None
循环吗? Numpy版本是1.9.1,Python 3.4.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]
。第一部分很容易通过True
(see here for the rationale behind this)这一事实来解释。要理解第二种情况返回np.nan != np.nan
的原因,请记住True
在检查相等性(list.__contains__()
)之前首先检查身份(is
)。自==
起,第二种情况将返回np.nan is np.nan
。