2011-11-03 6 views
6

"में" मैं अगर किसी ने मुझसे इस के साथ मदद कर सकता है (और समझा क्या हो रहा है) की सराहना करेंगे।Numpy: समझ के साथ होता है में एक हाथ की जरूरत ऑपरेटर

यह काम करता है:

>>> from numpy import array 
>>> a = array((2, 1)) 
>>> b = array((3, 3)) 
>>> l = [a, b] 
>>> a in l 
True 

लेकिन यह नहीं करता है:

>>> c = array((2, 1)) 
>>> c in l 
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() 

व्यवहार मैं दोहराने के लिए चाहते हैं:

>>> x = (2, 1) 
>>> y = (3, 3) 
>>> l2 = [x, y] 
>>> z = (2, 1) 
>>> z in l2 
True 

ध्यान दें कि क्या इसके बाद के संस्करण भी परिवर्तनशील के साथ काम ऑब्जेक्ट्स:

>>> x = [2, 1] 
>>> y = [3, 3] 
>>> l2 = [x, y] 
>>> z = [2, 1] 
>>> z in l2 
True 
बेशक

, जानते हुए भी कि:

>>> (a < b).all() 
True 

मैंने कोशिश की (और असफल):

>>> (c in l).all() 
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() 

उत्तर

6

अजगर कि bool([False,True])True है, क्योंकि (यह कहते हैं) विकल्प बनाता है किसी भी गैर empy सूची है बुलियन मूल्य सही है।

Numpy विकल्प है कि bool(np.array([False, True])) एक ValueError उठाना चाहिए बनाता है। Numpy है जो कुछ प्रयोक्ताओं जानना चाहते हैं कि किसी भी सरणी में तत्वों की सच कर रहे हैं चाहते हो सकता है दृष्टि से डिजाइन किया गया था, जबकि दूसरों को जानना चाहते हैं कि सभी सरणी में तत्वों सच कर रहे हैं चाहते हो सकता है। चूंकि उपयोगकर्ताओं के पास विवादित इच्छाएं हो सकती हैं, इसलिए न्यूमपी अनुमान लगाने से इंकार कर देती है। यह एक ValueError को जन्म देती है और np.any या np.all का उपयोग कर (हालांकि अगर एक अजगर की तरह व्यवहार को दोहराने के लिए चाहता है, तो आप len का उपयोग करेंगे) पता चलता है।

जब आप c in l का मूल्यांकन, अजगर l में प्रत्येक तत्व a के साथ शुरू के साथ c तुलना करती है। यह bool(c==a) का मूल्यांकन करता है। हमें bool(np.array([True True])) मिलता है, जो एक ValueError (ऊपर वर्णित कारण के लिए) उठाता है।

के बाद से numpy लगता लिए मना कर दिया, तो आप विशिष्ट रहना होगा। मेरा सुझाव है:

import numpy as np 
a=np.array((2,1)) 
b=np.array((3,3)) 
c=np.array((2,1)) 
l=[a,b] 
print(any(np.all(c==elt) for elt in l)) 
# True 
+0

बहुत उपयोगी, धन्यवाद (+1) ... मुझे अभी भी नहीं मिल रहा है कि क्यों 'एल इन' को 'सी में एल' से अलग परिणाम मिलता है। दोनों स्थितियों में कमांड को एक मानक सूची में एक numpy सरणी का परीक्षण करना चाहिए ... अंतर क्या है जो मैं नहीं देख सकता? – mac

+0

@mac: यह एक अच्छा सवाल है, और मुझे जवाब नहीं पता है। [दस्तावेज़ कहते हैं] (http://docs.python.org/reference/expressions.html#notin), "सूची और टुपल प्रकारों के लिए, वाई में वाई सच है अगर और केवल अगर कोई अनुक्रमणिका मौजूद है तो मैं x == वाई [i] सच है। ", लेकिन 'बूल (ए == एल [0])' एक ValueError उठाता है और फिर भी 'l में एक रिटर्न सही होता है। मुझे नहीं पता कि इस (प्रतीत होता है) विरोधाभास को कैसे हल किया जाए। – unutbu

+0

और रहस्य में जोड़ने के लिए, 'बी में एल' एक ValueError उठाता है ... – unutbu