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

السؤال

نشر

 

لدي مجموعة بيانات من المسافات تسمى 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)))]

 

  • 0
نشر

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

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

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

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

 

  • 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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...