我有一个数组数组:
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__
不会工作。还有其他检查方法吗?
答案 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的链接,这个答案就不会完整。