爲什麼這不起作用
短的版本是,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
從二維數組轉換成一維數組,所以我們可以通過它直線篩,並將其轉換爲一個列表,以避免numpy的殘破array.__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]
這幾乎是:http://stackoverflow.com/questions/14766194/testing-whether-a-numpy-array-contains-a-given-行/ 14772313我想你可能會在那裏找到答案。 – seberg 2013-02-24 23:31:40