为什么这不起作用
简短的版本是 numpy 的实现array.__contains__()
似乎被破坏了。python 中的运算符在幕后in
调用。__contains__()
意思a in b
是等价于b.__contains__(a)
。
我已经在 REPL 中加载了您的数组并尝试以下操作:
>>> b[:,0]
array([(0, 0), (1, 0), (2, 0)], dtype=object)
>>> (0,0) in b[:,0] # we expect it to be true
False
>>> (0,0) in list(b[:,0]) # this shouldn't be different from the above but it is
True
>>>
如何修复它
我看不出你的列表理解是如何工作的,因为a[x]
它是一个元组并且b[:,:]
是一个二维矩阵,所以它们当然是不相等的。但我假设您打算使用in
而不是==
. 如果我在这里错了,请纠正我,你的意思是我没有看到的不同的东西。
第一步是b
从 2D 数组转换为 1D 数组,以便我们可以线性筛选它并将其转换为列表以避免 numpyarray.__contains()
像这样损坏:
bb = list(b.reshape(b.size))
或者,更好的是,使它成为一个,set
因为元组是不可变的,并且in
在集合中检查是 O(1) 而不是列表的 O(n) 行为
>>> bb = set(b.reshape(b.size))
>>> print bb
set([(0, 1), (1, 2), (0, 0), (2, 1), (1, 1), (2, 0), (2, 2), (1, 0), (0, 2)])
>>>
接下来我们简单地使用列表推导推导出布尔值表
>>> truth_table = [tuple(aa) in bb for aa in a]
>>> print truth_table
[True, True, True]
>>>
完整代码:
def contained(a,b):
bb = set(b.flatten())
return [tuple(aa) in bb for aa in a]