Numpy数组__contains__检查

时间:2013-12-03 02:46:18

标签: python numpy

我有一个数组数组:

temp = np.empty(5, dtype=np.ndarray) 
temp[0] = np.array([0,1])

我想检查是否np.array([0,1]) in temp,在上面的示例中显然是,但代码返回false。我也试过temp.__contains__(np.array([0,1]))但也返回false。为什么是这样?它不应该归还吗?

编辑:

所以__contain__不会工作。还有其他检查方法吗?

1 个答案:

答案 0 :(得分:2)

在python中,您需要理解的一件事是,在语义上,__contains__基于__eq__,即它查找满足==谓词的元素。 (当然可以覆盖__contains__运算符来执行其他操作,但这是另一回事。)

现在,对于numpy数组,__eq__根本不会返回bool。每个使用numpy的人都会在某些时候遇到这个错误:

if temp == temp2:
   print 'ok'
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这意味着,鉴于__contains__ndarray.__eq__的语义冲突,这种操作不能满足您的需求并不奇怪。

使用您发布的代码,将temp设置为np.array而非list没有明显优势。在任何一种情况下,您都可以用以下内容“模拟”__contains__的行为。

temp2 = np.array([0,1])
any( (a == temp2).all() for a in temp if a is not None )

如果您首先解释为什么选择使用hetrogeneous np.array,我可能会提出更详细的解决方案。

当然,如果没有@ user2357112与this question的链接,这个答案就不会完整。