2012-09-28 12 views
11

इंडेक्स करने का प्रयास करते समय अस्पष्ट है, यदि मैं var (अन्य numpy array) में तत्व> = 0 और तत्वों में तत्वों को आरबीएस के सभी तत्वों को एक नए सरणी में डालने की कोशिश कर रहा हूं, < = .1। मैं गलत क्या कर रही हूं परएक से अधिक तत्व वाले एक सरणी का सच्चा मूल्य अस्पष्ट

ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all()` 

rbs = [ish[4] for ish in realbooks] 
for book in realbooks: 
    var -= float(str(book[0]).replace(":", "")) 
    bidsred = rbs[(var <= .1) and (var >=0)] 

किसी भी विचार: हालांकि जब मैं निम्नलिखित कोड की कोशिश मैं इस त्रुटि मिलती है?

+0

कौन सी रेखा त्रुटि का कारण बनती है? कृपया अपना कोड प्रारूपित करें ताकि यह वास्तव में चलता है। –

+0

यदि आप var के मान को मुद्रित करते हैं तो इससे मदद मिलेगी। एक अनुमान में, समस्या स्ट्रिंग/फ्लोट/पाठ प्रतिस्थापन चर में है जिसे आप कम कर रहे हैं ... मूल डेटा कैसा दिखता है जिसके लिए संचालन की श्रृंखला की आवश्यकता होगी? – abought

उत्तर

27

जैसा कि मैंने पिछले एक के लिए एक टिप्पणी में कहा जवाब है, तो आप या तो उपयोग करने की आवश्यकता:

c[a & b] 

या

c[np.logical_and(a, b)] 

कारण यह है कि and कीवर्ड का उपयोग पायथन द्वारा दो बूलियन के बीच परीक्षण करने के लिए किया जाता है। एक सरणी एक बुलियन कैसे हो सकता है? यदि 75% आइटम True हैं, तो यह True या False है? इसलिए, numpy दो की तुलना करने से मना कर दिया।

तो, आपको या तो तत्व-दर-तत्व आधार (np.logical_and) या बाइनरी ऑपरेटर & पर दो बूलियन सरणी की तुलना करने के लिए लॉजिकल फ़ंक्शन का उपयोग करना होगा।

इसके अलावा, अनुक्रमण उद्देश्यों के लिए, आपको वास्तव में उसी सारणी के साथ एक बूलियन सरणी की आवश्यकता होती है, जिस सरणी को आप अनुक्रमणित कर रहे हैं। और यह एक सरणी होना चाहिए, आप True/False की सूची का उपयोग नहीं कर सकते हैं: कारण यह है कि एक बुलियन सरणी का उपयोग करने से NumPy को वापस करने के लिए तत्व दिखाई देता है। यदि आप True/False की सूची का उपयोग करते हैं, तो NumPy 1/0 की एक पूर्णांक के रूप में व्याख्या करेगा, यानी, सूचकांक, जिसका अर्थ है कि आपको या तो आपके सरणी का दूसरा या पहला तत्व मिलता है। आप क्या चाहते हैं नहीं।

अब, के रूप में आप अनुमान लगा सकते हैं, तो आप दो बूलियन सरणियों a या अनुक्रमण के लिए b उपयोग करने के लिए, आइटम चुनने चाहते हैं, जिसके लिए या तो a या b यह सच है, तो आप

c[np.logical_or(a,b)] 

या

का उपयोग करेंगे
c[a | b] 
8

जब तुलना NumPy सरणी, उदा से जुड़े भाव पर पायथन बूलियन ऑपरेटरों (not, and, or) का उपयोग करने की कोशिश कर आप आम तौर पर यह त्रुटि संदेश मिलता है

>>> x = np.arange(-5, 5) 
>>> (x > -2) and (x < 2) 
Traceback (most recent call last): 
    File "<ipython-input-6-475a0a26e11c>", line 1, in <module> 
    (x > -2) and (x < 2) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

क्योंकि इस तरह की तुलना के रूप में अजगर में अन्य की तुलना करने का विरोध किया, एकल बूलियन्स बजाय बूलियन्स की सरणियों बनाने (लेकिन शायद आप पहले से ही पता था कि) है कि: का हल की

>>> x > -2 
array([False, False, False, False, True, True, True, True, True, True], dtype=bool) 
>>> x < 2 
array([ True, True, True, True, True, True, True, False, False, False], dtype=bool) 

भाग अपने समस्या andnp.logical_and द्वारा प्रतिस्थापित करने के लिए संभव है, जो np.bool के दो सरणीओं पर और संचालन को प्रसारित करती है।

>>> np.logical_and(x > -2, x < 2) 
array([False, False, False, False, True, True, True, False, False, False], dtype=bool) 
>>> x[np.logical_and(x > -2, x < 2)] 
array([-1, 0, 1]) 

हालांकि, बूलियन्स के ऐसे सरणियों साधारण अजगर सूचियों में सूचकांक करने के लिए इस्तेमाल नहीं किया जा सकता है, तो आप एक सरणी है कि बदलने की आवश्यकता:

rbs = np.array([ish[4] for ish in realbooks])