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

إستخدام شروط متعددة في Numpy

Fahmy Mostafa

السؤال

 

لدي مجموعة بيانات من المسافات تسمى dists. أريد تحديد المسافات التي تكون بين قيمتين. لقد كتبت السطر التالي للقيام بذلك:

dists[(np.where(dists >= r)) and (np.where(dists <= r + dr))]

لكن بالرغم من ذلك أحصل على نفس النتيجة وكأني أستعمال الشرط التالي:

(np.where(dists <= r + dr))

إذا قمت بتنفيذ الأوامر بالتسلسل باستخدام متغير مؤقت ، فإنه يعمل بشكل جيد. لماذا لا يعمل الكود أعلاه ، وكيف يمكنني تشغيله؟

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

Recommended Posts

  • 1

أفضل طريقة في حالتك الخاصة هي فقط تغيير المعيارين إلى معيار واحد:

dists[abs(dists - r - dr/2.) <= dr/2.]

والإجابة على سؤالك:

انت لست بحاجة فعلاً الى where إذا كنت تحاول فقط تصفية عناصر dists التي لا تتناسب مع معاييرك:

dists[(dists >= r) & (dists <= r+dr)]

لأن & سيعطيك عنصرًا أساسيًا and (الأقواس ضرورية).

أو ، إذا كنت تريد الاستخدام where لسبب ما ، فيمكنك القيام بما يلي:

 dists[(np.where((dists >= r) & (dists <= r + dr)))]

 

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

  • 1

لاتستخدم And هنا، يمكنك استخدام:

dists[(dists >= r) & (dists <= r+dr)]
# أو 
dists[(np.where((dists >= r) & (dists <= r + dr)))]

لأن & هو "element-wise and" أي يطبق عملية and على أطراف العلاقة بت بت (وهذا سبب تسمية هذه المعاملات ب bitwise).
إن np.where تعيد قائمة من الفهارس وليس مصفوفة بوليانية، وأنت تحاول استخدام and مع مصفوفتين من الأرقام (ليست قيم بوليانية). وبالتالي إذا كنت x و y كلاهما True فهذا يعني أن a and b=b:

[0،3،6] and [2،5،4]=[2،5،4]

لاحظ معي:

#####################################################################
dists = np.arange(0,8,.7)
r = 5
dr = 1
np.where(dists >= r)
#(array([ 8,  9, 10, 11], dtype=int64),)
np.where(dists <= r+dr)
#(array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int64),)
np.where(dists >= r) and np.where(dists <= r+dr)
#(array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int64),)
#####################################################################
# أما الذي كنت تتوقع مقارنته هو مصفوفة منطقية، على سبيل المثال
dists >= r
#array([False, False, False, False, False, False, False, False,  True, True,  True,  True])
dists <= r + dr
# array([ True,  True,  True,  True,  True,  True,  True,  True,  True, False, False, False])
(dists >= r) & (dists <= r + dr)
# array([False, False, False, False, False, False, False, False,  True, False, False, False])

يمكنك الآن استدعاء np.where على المصفوفة المنطقية المدمجة:

dists[np.where((dists >= r) & (dists <= r + dr))]

 

 

 

 

 

 

 

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استخدام المعاملات المنطقية التي توفرها numpy وفي حالتك تريد تنفيذ عدة شروط فيمكنك استخدام المعامل numpy.logical_and  ليصبح الكود كالتالي

np.where(np.logical_and(np.greater_equal(dists,r),np.greater_equal(dists,r + dr)))

لاحظ أننا استخدمنا المعامل greater_equal 

يمكننا قراءة المزيد من المعلومات حول المعاملات المنطقية من هنا

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...