• 0

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

أحاول أن أقوم بعمل دالة تتأكد من أن متغير معين عبارة عن مصفوفة 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 عادية؟

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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

 

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


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

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

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

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

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن