ValueError: एक सरणी का सत्य मान एक से अधिक तत्वों के साथ अस्पष्ट है। A.any () या a.all () का उपयोग करें


221

मैंने अपने कोड में एक तार्किक बग की खोज की जो सभी प्रकार की समस्याओं का कारण बन रहा था। मैं अनजाने एक कर रहा था बिटवाइज़ और एक के बजाय तार्किक और

मैंने से कोड बदल दिया है:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

सेवा:

r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]

मेरे आश्चर्य के लिए, मुझे नहीं बल्कि गुप्त त्रुटि संदेश मिला:

ValueError: एक सरणी का सत्य मान एक से अधिक तत्वों के साथ अस्पष्ट है। A.any () या a.all () का उपयोग करें

जब मैं एक बिटवाइस ऑपरेशन का उपयोग करता हूं तो एक समान त्रुटि क्यों नहीं हुई - और मैं इसे कैसे ठीक करूं?


1
पंडों ने इसके लिए दस्तावेज़ीकरण भी प्रस्तुत किया है
ग्रेग

जवाबों:


164

rएक सुन्न (आरई) सरणी है। तो r["dt"] >= startdateयह भी (बूलियन) सरणी है। सुन्न सरणियों के लिए &ऑपरेशन तत्व-और दो बूलियन सरणियों को लौटाता है।

NumPy डेवलपर्स ने महसूस किया कि बूलियन संदर्भ में किसी सरणी का मूल्यांकन करने का कोई आम तौर पर समझा गया तरीका नहीं है: इसका मतलब यह हो सकता है Trueकि कोई तत्व है Trueया इसका मतलब यह हो सकता है Trueकि सभी तत्व हैं True, या Trueयदि सरणी में गैर-शून्य लंबाई है, तो सिर्फ तीन का नाम संभावनाओं।

चूंकि अलग-अलग उपयोगकर्ताओं की अलग-अलग ज़रूरतें और अलग-अलग धारणाएं हो सकती हैं, इसलिए जब भी कोई व्यक्ति बूलियन संदर्भ में किसी सरणी का मूल्यांकन करने का प्रयास करता है, तो NumPy डेवलपर्स ने अनुमान लगाने से इनकार कर दिया और इसके बजाय एक ValueError बढ़ाने का फैसला किया। andदो सुन्न सरणियों पर लागू करने से बूलियन संदर्भ में दो सरणियों का मूल्यांकन किया जा सकता है ( __bool__पायथन 3 या पायथन 2 में कॉल __nonzero__करके)।

आपका मूल कोड

mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]

सही लग रहा है। हालांकि, यदि आप चाहते हैं and, तो a and bउपयोग के बजाय (a-b).any()या (a-b).all()


2
आप सही हे। मूल कोड सही था। बग कोड में कहीं और झूठ बोलता प्रतीत होता है।
होम्युनकुलस रेटिकुल्ली

2
बहुत बढ़िया स्पष्टीकरण। इसका तात्पर्य यह है कि, NumPy काफी अक्षम है: यह पूरी तरह से दोनों बूलियन सरणियों का मूल्यांकन करता है, जबकि एक कुशल कार्यान्वयन एक एकल लूप के अंदर cond1 (i) && cond2 (i) का मूल्यांकन करेगा, और cond2 को तब तक स्किप करेगा जब तक कि cond1 सच नहीं है।
जोकिम डब्ल्यू ०

@JoachimWuttke: हालांकि np.allऔर np.anyशॉर्ट सर्किट में सक्षम हैं, तर्क यह करने के लिए पारित कर दिया इससे पहले कि मूल्यांकन किया जाता है np.allया np.anyशॉर्ट सर्किट के लिए एक मौका है। वर्तमान में, बेहतर करने के लिए, आपको इसके समान विशेष C / Cython कोड लिखना होगा
22

47

मुझे एक ही समस्या थी (यानी बहु-स्थितियों के साथ अनुक्रमण, यहाँ यह एक निश्चित तिथि सीमा में डेटा खोज रहा है)। (a-b).any()या (a-b).all()काम नहीं कर रहा लगते, कम से कम मेरे लिए।

वैकल्पिक रूप से मुझे एक और समाधान मिला जो मेरी वांछित कार्यक्षमता के लिए पूरी तरह से काम करता है ( एक सरणी को अनुक्रमित करने की कोशिश करते समय एक से अधिक तत्वों के साथ सरणी का सत्य मान अस्पष्ट है )।

ऊपर सुझाए गए कोड का उपयोग करने के बजाय, बस एक numpy.logical_and(a,b)काम का उपयोग करना होगा। यहां आप कोड को फिर से लिखना चाहते हैं

selected  = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]

34

अपवाद का कारण andअंतर्निहित कॉल है bool। पहले बाएं ऑपरेंड पर और (अगर बाएं ऑपरेंड है True) तो राइट ऑपरेंड पर। तो x and yके बराबर है bool(x) and bool(y)

हालाँकि एक boolपर numpy.ndarray(यदि इसमें एक से अधिक तत्व हैं) आपके द्वारा देखे गए अपवाद को फेंक देगा:

>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

bool()कॉल निहित में है and, लेकिन यह भी में if, while, or, तो निम्न उदाहरण में से किसी भी असफल हो जायेगी:

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

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

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

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

पायथन में अधिक फ़ंक्शन और कथन हैं जो boolकॉल छिपाते हैं, उदाहरण के लिए 2 < x < 10लेखन का एक और तरीका है 2 < x and x < 10। और andकॉल करेंगे bool: bool(2 < x) and bool(x < 10)

इसके लिए तत्व-वार समतुल्य andहोगा np.logical_and, इसी तरह आप इसके लिए np.logical_orबराबर का उपयोग कर सकते हैं or

बूलियन सरणियों के लिए - और तुलना की तरह है <, <=, ==, !=, >=और >NumPy पर सरणियों बूलियन NumPy सरणी वापसी - आप भी उपयोग कर सकते हैं तत्व के लिहाज से बिटवाइज़ कार्य (और ऑपरेटरों): np.bitwise_and( &ऑपरेटर)

>>> np.logical_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> np.bitwise_and(arr > 1, arr < 3)
array([False,  True, False], dtype=bool)

>>> (arr > 1) & (arr < 3)
array([False,  True, False], dtype=bool)

और bitwise_or( |ऑपरेटर):

>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False,  True], dtype=bool)

>>> (arr <= 1) | (arr >= 3)
array([ True, False,  True], dtype=bool)

तार्किक और बाइनरी फ़ंक्शंस की एक पूरी सूची को NumPy प्रलेखन में पाया जा सकता है:


2

यदि आप pandasमेरे लिए इस मुद्दे को हल करने के साथ काम करते हैं कि मैं एनए मान होने पर गणना करने की कोशिश कर रहा था, तो समाधान चलाना था:

df = df.dropna()

और उसके बाद की गणना विफल हो गई।


0

यह टाइप किया गया त्रुटि-संदेश भी दिखाता है जबकि if-statementतुलना की जाती है जहां एक सरणी होती है और उदाहरण के लिए एक बूल या इंट। उदाहरण के लिए देखें:

... code snippet ...

if dataset == bool:
    ....

... code snippet ...

इस खंड में सरणी के रूप में डाटासेट है और बूल "ओपन डोर" ... Trueया है False

यदि try-statementआप except Exception as error:अपने त्रुटि-प्रकार के बिना संदेश प्राप्त करेंगे , तो फ़ंक्शन लिपटे हुए है :

एक से अधिक तत्वों वाले सरणी का सत्य मान अस्पष्ट है। A.any () या a.all () का उपयोग करें


-6

इसे आज़माएँ => numpy.array (r) या numpy.array (आपका उपयोग करने योग्य) इसके बाद जो कुछ भी आप चाहते हैं उसकी तुलना करने के लिए कमांड द्वारा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.