यदि चर कोई नहीं है या numpy.array है तो जाँच करें


104

अगर चर कोई नहीं है या numpy.array है, तो मैं यह जांचना चाहता हूं। मैंने इसे करने के लिए check_aफ़ंक्शन कार्यान्वित किया है ।

def check_a(a):
    if not a:
        print "please initialize a"

a = None
check_a(a)
a = np.array([1,2])
check_a(a)

लेकिन, यह कोड ValueError को बढ़ाता है। सीधा आगे का रास्ता क्या है?

ValueError                                Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
      6 check_a(a)
      7 a = np.array([1,2])
----> 8 check_a(a)

<ipython-input-41-0201c81c185e> in check_a(a)
      1 def check_a(a):
----> 2     if not a:
      3         print "please initialize a"
      4 
      5 a = None

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

2
यह ValueErrorसबसे आम numpyप्रश्नों में से एक है। इसका मतलब है कि not aएक बूलियन सरणी का उत्पादन, (इस मामले में) 2 मूल्यों के साथ। इस बूलियन सरणी को एक ifशर्त के रूप में इस्तेमाल नहीं किया जा सकता है ! is Noneवैकल्पिक पता करने के लिए अच्छा है, लेकिन आप भी इस त्रुटि को समझना चाहिए।
हंपुलज

@ अंपुलज: काफी नहीं - आप ओवरलोड नहीं कर सकते हैं not, इसलिए त्रुटि वास्तव में तब होती है जब notएक ही बूलियन के रूप में सरणी का इलाज करने की कोशिश करता है और पता चलता है कि यह नहीं हो सकता। यदि ऐसा ~aहोता है, तो यह ifएक बूलियन के रूप में नकारा गया सरणी का उपयोग करने की कोशिश करने पर NumPy के अधिभार का उपयोग करता है और विफल रहा है ।
user2357112

जवाबों:


174

का उपयोग करना not aहै कि क्या परीक्षण करने के लिए aहै Noneमानता है कि के अन्य संभावित मान aका एक सच मान है True। हालाँकि, अधिकांश NumPy सरणियों में एक सत्य मूल्य नहीं होता है, और notउन पर लागू नहीं किया जा सकता है।

यदि आप परीक्षण करना चाहते हैं कि कोई वस्तु है या नहीं None, तो सबसे सामान्य, विश्वसनीय तरीका है वस्तुतः isचेक के खिलाफ प्रयोग करना None:

if a is None:
    ...
else:
    ...

यह एक सत्य मूल्य वाली वस्तुओं पर निर्भर नहीं करता है, इसलिए यह NumPy सरणियों के साथ काम करता है।

ध्यान दें कि परीक्षा होनी है is, नहीं ==isएक वस्तु पहचान परीक्षण है। ==जो कुछ भी तर्क है वह कहता है, और NumPy सरणियों का कहना है कि यह एक प्रसारण तत्व समता तुलना है, जो एक द्विपदीय उत्पादन करता है:

>>> a = numpy.arange(5)
>>> a == None
array([False, False, False, False, False])
>>> if a == None:
...     pass
...
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()

चीजों के दूसरी तरफ, यदि आप यह जांचना चाहते हैं कि क्या एक ऑब्जेक्ट एक NumPy सरणी है, तो आप इसके प्रकार का परीक्षण कर सकते हैं:

# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
    ...
else:
    ...

आप इसका उपयोग भी कर सकते हैं isinstance, जो Trueउस प्रकार के उपवर्गों के लिए भी लौटेगा (यदि आप चाहते हैं कि)। यह देखते हुए कि कितना भयानक और असंगत np.matrixहै, आप वास्तव में यह नहीं चाह सकते हैं:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    

4
जो आप सलाह देते हैं वह "सर्वश्रेष्ठ" समाधान है?
मोनिका हेडडेक

2

यदि आप कुछ समान करने की कोशिश कर रहे हैं: a is not Noneतो वही मुद्दा सामने आता है। यही है, Numpy शिकायत करता है कि एक का उपयोग करना चाहिए a.anyया a.all

एक समाधान यह करना है:

if not (a is None):
    pass

बहुत सुंदर नहीं है, लेकिन यह काम करता है।


0

आप देख सकते हैं कि ऑब्जेक्ट का आकार है या नहीं

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False

1
नीचा दिखाया गया है: अन्य प्रकार के आकार की विशेषता भी हो सकती है, और उनके अलग-अलग अर्थ भी हो सकते हैं।
हर्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.