اذهب إلى المحتوى
  • 0

خطأ ValueError: The truth value of an array with more than one element is ambiguous. في Numpy

Amer Abdallah

السؤال

أحاول أن أقوم بعمل دالة تتأكد من أن متغير معين عبارة عن مصفوفة Numpy أم None لذلك قمت بعمل الدالة التالية:

>>> import numpy as np
>>> def check(x):
...     if not x: print(True)
...
>>> arr = None
>>> check(arr)
...
True
>>> arr = np.array([1,2])
>>> check(arr)
...
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()
>>>

لم أفهم سبب هذا الخطأ، كيف يمكنني التأكد مما إذا كان المتغير arr عبارة عن None أم مصفوفة Numpy عادية؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 2

قد ينتح هذا الخطأ في كثير من السيناريوهات أيضاً. بالنسبة لحالتك فإن المعامل not يطبق لنفي قيمة لكن لايمكنك تطبيقه لنفي عدة قيم في نفس اللحظة، وبالتالي عندما تمرر له مصفوفة سيعتبر أن ماقدمته له هو شيء غامض ولايستطيع التعامل معه لأنه يحوي عدة قيم، وبالتالي يقترح عليك أن تستخدم التابعين a.all()  أو a.any()  حسب ماتحتاج. الآن أنت تريد أن تعرف فيما إذا كانت مصفوفتك هي None أم لا وبالتالي تحاول استخدام not وكما نعرف فإن not None يعطي True وهذا جيد. الآن فكرتك هي أنه عندما تطبق not على مصفوفة سيعطيك False لأنه تحوي قيم (أي أنها تعتبر True)، أو حسب الكود الخاص بك لايعطي شيئ. ولكن هذا لن ينجح وسيعطيك الخطأ المذكور، وبالتالي لحل المشكلة سنستخدم التابعين اللذين اقترحهما بايثون، لكن في حالتنا فإن التابع الذي نحتاجه هو any، لكن قبل ذلك دعني أشرح لك مبدأ عمل هذا التابع، حيث أنه يقبل وسيط من أي نوع ويختبر فيما إذا كانت أي قيمة من قيمه على الأقل هي True فإذا وجد true يرد true وإلا false وهذا مانحتاجه، انظر للأمثلة:

# لإرضاً نريد معرفة فيما إذا كان هنا عنصر واحد على الأقل من المصفوفة يحقق شرط معين
# أي مثلاً هل يوجد أي قيمة أكبر من 0 
arr = np.array([1,2])
arr>0 # array([ True,  True])
np.any(arr>0) #true بالتالي سيعطي  true هنا سيجد قيمة 
#true تمرير قيمة وحيدة سيعتبرها
np.any(5) #true
# لكن لو مررت 0 فسيعطي فالس لأن ال0 تقابل الفالس في بايثون
np.any(0) # false
# هنا سيرد none
np.any(None)
#False هنا سيرد 
np.any(False)

وبالتالي يصبح الكود:

import numpy as np
def check(x):
    if not np.any(arr):
      print("It's None") 
    else:
      print ("It's an array")  
arr = None
check(arr)
# It's None
arr = np.array([1,2])
check(arr)
# It's an array

كما ويمكنك استخدام is None كما أشار الأستاذ محمد.
كما ويمكننا استخدام فكرة نمط المصفوفة، فكما نعلم بأن المصفوفات في نمباي هي من النمط np.ndarray وبالتالي فيمكنك اختبار فيما إذا كانت الوسيط الممرر للتابع هو من هذا النمط أم لا من خلال التابع isinstance:

import numpy as np
def check(x):
    if isinstance(x, np.ndarray):
      print ("it's not")  
    else:
      print("It's None") 
arr = None
check(arr)
# It's None
arr = np.array([1,2])
check(arr)
# It's an array

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لا يمكن تطبيق او استخدام not لاختبار ما إذا كان x تساوي None في NumPy ، لأن معظم مصفوفات NumPy ليس لها قيمة حقيقة ، ولذلك لا يمكن تطبيقها عليها. إذا كنت ترغب في اختبار ما إذا كان الكائن None ، فإن الطريقة الأكثر عمومية وموثوقية هي استخدام is كالتالي:

>>> import numpy as np
>>> def check(x):
...     if x is None: print(True)

is لا تعتمد على الأشياء التي لها قيمة حقيقية ، لذلك فهي تعمل مع مصفوفات NumPy.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...