في Python، يمكننا استخدام الدالة numpy.where() لتحديد العناصر من مصفوفة numpy، استنادًا إلى شرط.
ليس فقط ذلك، ولكن يمكننا أيضًا إجراء بعض العمليات على تلك العناصر إذا تم تحقيق الشرط.
لنلقِ نظرة على كيفية استخدام هذه الدالة، باستخدام بعض الأمثلة التوضيحية!
بناء جملة Python numpy.where()
تقبل هذه الدالة مصفوفة مشابهة لـ numpy (مثلاً مصفوفة NumPy من الأعداد الصحيحة / المنطقية).
تُرجع مصفوفة numpy جديدة، بعد تصفية بناءً على شرط، والذي هو مصفوفة مشابهة لـ numpy من القيم المنطقية.
على سبيل المثال، يمكن أن يأخذ الشرط
قيمة array([[True, True, True]])
، وهي مصفوفة بولية مشابهة لـ numpy. (بشكل افتراضي، يدعم NumPy قيمًا رقمية فقط، ولكن يمكننا تحويلها إلى bool
أيضًا)
على سبيل المثال، إذا كان الشرط
هو array([[True, True, False]])
، وكانت مصفوفتنا هي a = ndarray([[1, 2, 3]])
، عند تطبيق الشرط على المصفوفة (a[:, condition]
)، سنحصل على المصفوفة ndarray([[1 2]])
.
النتيجة
ملحوظة: يمكن أيضًا تمثيل نفس الشرط كـ a <= 2. هذا هو التنسيق الموصى به لمصفوفة الشروط، حيث أنه من الممل كتابتها كمصفوفة بوليانية
ولكن ماذا لو أردنا الحفاظ على بُعد النتيجة، وعدم فقدان عناصر من مصفوفتنا الأصلية؟ يمكننا استخدام numpy.where() لذلك.
لدينا معلمتان إضافيتان x
و y
. ما هما؟
ببساطة، ما يقوله هذا هو أنه إذا كان condition
صحيحًا لبعض العناصر في مصفوفتنا، فستختار المصفوفة الجديدة عناصر من x
.
وعلاوة على ذلك، إذا كانت كاذبة، سيتم اختيار العناصر من y
.
بهذا، ستكون مصفوفة الناتج النهائية مصفوفة تحتوي على عناصر من x
في أي مكان condition = True
، وعناصر من y
في أي مكان condition = False
.
يرجى ملاحظة أنه على الرغم من أن x
و y
اختيارية، إلا أنه إذا حددت x
، يجب عليك أيضًا تحديد y
. هذا لأن شكل مصفوفة الإخراج يجب أن يكون نفس شكل مصفوفة الإدخال في هذه الحالة.
ملحوظة: نفس المنطق ينطبق على كل من المصفوفات ذات الأبعاد الفردية والمتعددة أيضًا. في كلتا الحالتين، نقوم بتصفية بناءً على الشرط. ولاحظ أيضًا أن أشكال x
و y
و condition
يتم بثها معًا.
الآن، دعونا نلقي نظرة على بعض الأمثلة، لفهم هذه الوظيفة بشكل صحيح.
استخدام numpy.where() في Python
لنفترض أننا نريد أخذ العناصر الإيجابية فقط من مصفوفة numpy وتعيين جميع العناصر السالبة إلى 0، دعونا نكتب الكود باستخدام numpy.where()
.
1. استبدال العناصر باستخدام numpy.where()
سنستخدم مصفوفة عشوائية ثنائية الأبعاد هنا، ونخرج فقط العناصر الإيجابية.
الناتج المحتمل
كما ترون، تم الآن الاحتفاظ فقط بالعناصر الإيجابية!
2. استخدام numpy.where() مع شرط واحد فقط
قد يكون هناك بعض الارتباك بخصوص الشيفرة أعلاه، حيث قد يعتقد بعضكم أن الطريقة الأكثر وضوحًا ستكون ببساطة كتابة الشرط بهذا الشكل:
إذا قمت الآن بتشغيل الشيفرة أعلاه، مع هذا التغيير، ستحصل على نتيجة مثل هذه:
إذا لاحظت بعناية، فإن b
الآن هو tuple من مصفوفات numpy. وكل مصفوفة هي موقع عنصر إيجابي. ماذا يعني هذا؟
كلما قدمنا شرطًا فقط، فإن هذه الدالة في الواقع مكافئة لـ np.asarray.nonzero()
.
في مثالنا، ستقوم np.asarray(a > 0)
بإرجاع مصفوفة تشبه القيم المنطقية بعد تطبيق الشرط، وستقوم np.nonzero(arr_like)
بإرجاع الفهارس للعناصر غير الصفرية من arr_like
. (انظر إلى this الرابط)
لذا، سننظر الآن إلى مثال أبسط، يظهر لنا مدى مرونتنا مع numpy!
الناتج
هنا، الشرط هو a < 5
، والذي سيكون مصفوفة تشبه numpy [True True True True True False False False False False]
، x
هي المصفوفة a، وy
هي المصفوفة a * 10. لذا، نختار من a فقط إذا كانت a < 5، ومن a * 10، إذا كانت a > 5.
لذا، يقوم هذا بتحويل جميع العناصر >= 5، عن طريق الضرب في 10. هذا ما نحصل عليه بالفعل!
البث باستخدام numpy.where()
إذا قدمنا كل من مصفوفة الشرط
، س
، و ص
، فستقوم numpy ببثها معًا.
الناتج
هنا مرة أخرى، يتم اختيار الناتج بناءً على الشرط، لذا جميع العناصر، ولكن هنا، تم بث ص
إلى شكل أ
. (أحد أبعاده يحتوي على عنصر واحد فقط، لذا لن يحدث أي أخطاء أثناء البث)
لذا، سيصبح ص
الآن [[0 1 2 3] [0 1 2 3] [0 1 2 3]]
، والآن، يمكننا تحديد العناصر حتى من هذه المصفوفة المبثوثة.
لذا شكل الناتج هو نفس شكل أ
.
الاستنتاج
في هذه المقالة، تعلمنا كيف يمكننا استخدام وظيفة Python numpy.where() لتحديد المصفوفات بناءً على مصفوفة شرط أخرى.
المراجع
- وثائق SciPy حول وظيفة numpy.where() في Python
Source:
https://www.digitalocean.com/community/tutorials/python-numpy-where