2016-03-23 6 views
9

यह जांचने का सबसे अच्छा तरीका क्या है कि कोई numpy सरणी किसी अन्य सरणी का कोई तत्व है या नहीं?पायथन: जांचें कि क्या एक numpy सरणी में किसी अन्य सरणी का कोई तत्व

उदाहरण:

array1 = [10,5,4,13,10,1,1,22,7,3,15,9] 
array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23]` 

मैं एक True अगर array1array2 के किसी भी मान प्राप्त करना चाहते हैं, नहीं तो एक False। यदि आप परिणाम प्राप्त मतलब है दोनों सरणी में आम तत्वों देखते हैं

+2

आप 'set' – Nilesh

+2

का उपयोग कर सकते हैं' np.any (np.in1d ​​(array2, array1)) '। – Norman

उत्तर

14

पांडा का उपयोग करके आप isin उपयोग कर सकते हैं:

a1 = np.array([10,5,4,13,10,1,1,22,7,3,15,9]) 
a2 = np.array([3,4,9,10,13,15,16,18,19,20,21,22,23]) 

>>> pd.Series(a1).isin(a2).any() 
True 

और in1d numpy समारोह (@Norman से टिप्पणी प्रति) का उपयोग:

>>> np.any(np.in1d(a1, a2)) 
True 

छोटे सरणियों के लिए इस तरह के इस उदाहरण में उन लोगों के रूप , सेट का उपयोग कर समाधान स्पष्ट विजेता है। बड़े, विषम सरणी (यानी कोई ओवरलैप नहीं) के लिए, पांडो और नम्पी समाधान तेजी से होते हैं। हालांकि, np.intersect1d बड़े सरणी के लिए एक्सेल के लिए प्रतीत होता है।

छोटे सरणियों (12-13 तत्वों)

%timeit set(array1) & set(array2) 
The slowest run took 4.22 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 1.69 µs per loop 

%timeit any(i in a1 for i in a2) 
The slowest run took 12.29 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 1.88 µs per loop 

%timeit np.intersect1d(a1, a2) 
The slowest run took 10.29 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 15.6 µs per loop 

%timeit np.any(np.in1d(a1, a2)) 
10000 loops, best of 3: 27.1 µs per loop 

%timeit pd.Series(a1).isin(a2).any() 
10000 loops, best of 3: 135 µs per loop 

100k तत्वों (कोई ओवरलैप) साथ एक सरणी का उपयोग करना:

a3 = np.random.randint(0, 100000, 100000) 
a4 = a3 + 100000 

%timeit np.intersect1d(a3, a4) 
100 loops, best of 3: 13.8 ms per loop  

%timeit pd.Series(a3).isin(a4).any() 
100 loops, best of 3: 18.3 ms per loop 

%timeit np.any(np.in1d(a3, a4)) 
100 loops, best of 3: 18.4 ms per loop 

%timeit set(a3) & set(a4) 
10 loops, best of 3: 23.6 ms per loop 

%timeit any(i in a3 for i in a4) 
1 loops, best of 3: 34.5 s per loop 
+0

मेरे पास मेरी टिप्पणी में एरे बदल गए थे। मैंने इसे सही किया। – Norman

+0

@ नॉर्मन क्या मामला मायने रखता है? अगर हम यह जांचने के लिए परीक्षण कर रहे हैं कि वे एक मूल्य साझा करते हैं, तो मैं ऐसा नहीं सोचूंगा। – Alexander

+0

ओह हाँ सही यह देर हो चुकी है :-) हालांकि, प्रदर्शन कारणों से पहले कोई छोटा सरणी डाल सकता है। – Norman

6

आप इस

>>> array1 = [10,5,4,13,10,1,1,22,7,3,15,9] 
>>> array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23] 
>>> set(array1) & set(array2) 
set([3, 4, 9, 10, 13, 15, 22]) 

कोशिश कर सकते हैं।

यदि परिणाम खाली है तो कोई सामान्य तत्व नहीं है।

1

आप उपयोग कर सकते हैं any में निर्मित समारोह और सूची समझ:

>>> array1 = [10,5,4,13,10,1,1,22,7,3,15,9] 
>>> array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23] 
>>> any(i in array2 for i in array1) 
True 
संबंधित मुद्दे