2014-10-03 25 views
2

我想檢查數組列表中存在的數組。我的問題可以歸結爲以下示例:數組在列表中的存在

>>> import numpy as np 
>>> a = np.array([1,2,3]) 
>>> b = np.array([4,5,6]) 
>>> c = [a,b] 
>>> c 
[array([1, 2, 3]), array([4, 5, 6])] 
>>> a in c 
True 
>>> np.array([1,2,3]) in c 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
>>> d = np.array([1,2,3]) 
>>> d in c 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

如何檢查數組列表中是否存在數組?這工作,當我使用的常規列表,我期望:

>>> a = [1,2,3] 
>>> b = [4,5,6] 
>>> c = [a,b] 
>>> [1,2,3] in c 
True 
>>> [4,5,6] in c 
True 
>>> [1,2] in c 
False 
>>> d = [1,2,3] 
>>> d in c 
True 

回答

2

容易

import numpy as np 
a = np.array([1,2,3]) 
b = np.array([4,5,6]) 

c = np.array([a,b]) # < ---- this line! 

print repr(c) 
print a in c 

print np.array([1,2,3]) in c 

print [1,2,3] in C# Success!!! 
print np.array([1,2,3]).tolist() in c# also success!!! 
+0

在python 3.5中,numpy 1.10.4,如果ndarray1中的第一個元素出現在ndarray2中,而ndarray1的其他元素完全忽略,則「ndarray1在ndarray2中」看起來會返回true – 2016-04-18 11:19:05

+0

也就是說,這不會回答原始問題,並且事實上我不認爲在ndarrays上使用'in'關鍵字是爲了讓numpy開發者定義好行爲。 – 2016-04-18 11:25:10

+0

請嘗試「c」中的np.array([1,99,-1]),例如... – 2016-04-18 11:36:50

2

Joran的解決方案是一件好事,因爲它可以讓你使用你可能想使用直觀in功能。

但是,如果由於某種原因,你不能改變的c類型是np.array那麼這個功能將解決您的問題與原始數據類型的ab,並c

>>> def new_in(seq, elem): 
>>> return elem.tolist() in map(lambda e: e.tolist(), seq) 

>>> a = np.array([1,2,3]) 
>>> b = np.array([4,5,6]) 
>>> c = [a,b] 

>>> new_in(c,a) 
>>> True 
+0

+1 ...但可能需要確保您在itertools.imap中使用映射的生成器版本..否則你會將整個原始序列轉換爲python2中的正常列表...但實際上99.999%的時間不會真的成爲問題 – 2014-10-03 15:48:40

+0

同意。如果'seq'長或無限(迭代器),那麼'itertools.imap'而不是'map'更有意義。無論如何,最好把OP的示例序列'c'包裝在'np.array'中,就像你一樣。乾杯。 – 2014-10-03 17:02:28

0

numpy_indexed包(免責聲明:我是它的作者)可用於在numpythonic的方式來解決這個問題:

import numpy_indexed as npi 
npi.contains(c, a) 

注意,它不involv e轉換爲python類型,並且不使用python循環,所以在使用相當大的數組時,可以期望它更加高效。 'a'數組也可以是多維的,這樣您就可以在單個矢量化語句中測試多個值的存在。

是目前公認的答案不產生明確定義的結果。

相關問題