علوم وفضاء

select في NumPy: أي شرط يفوز عند التداخل؟

x سالب 4 و0 و3 و8 و12. C1 أكبر من أو يساوي 3 مع A، وC2 أكبر من أو يساوي 8 مع B. في التداخل عند 8 و12، أولوية C1 تعطي 23 و24، وأولوية C2 تعطي 53 و54.
نحفظ الشرط مع اختياره عند نقل الأولوية.

select تستخدم أول شرط متحقق عند تعدد المطابقات في الموضع نفسه. [1]

اقرأ التداخل مع أولوية الشرط

تختار select أول شرط متحقق واختياره الموافق. [1]

نؤلف x=[-4,0,3,8,12]، ونرقم مواضعها من صفر إلى أربعة. اختياراتنا A=[20,21,0,23,24] وB=[50,51,52,53,54]. الأعداد بلا وحدة؛ ليست قياس جودة أو مخرجات نموذج.

الشرط C1 هو x>=3، وقناعه [False,False,True,True,True]. الشرط C2 هو x>=8، وقناعه [False,False,False,True,True]. نقرن C1 بـA، وC2 بـB، ثم نضع C1 أولًا.

عند x=3 يطابق C1 فقط، فنأخذ قيمة A في موضعها، وهي 0. وعند x=8 وx=12 يطابق الشرطان معًا؛ أولوية C1 تعطينا 23 و24، لا 53 و54 من B. لا نفترض أن الحد الأعلى 8 يمنح نفسه الأولوية.

عند −4 و0 لا يطابق أي شرط، فنضع البديل الذي اخترناه، −99. بذلك يكون الناتج [-99,-99,0,23,24]. العدد 0 في الموضع الثالث قيمة اختيار معلنة؛ لا يشير إلى أن شرط هذا الموضع فشل.

قاعدة الترتيب جزء من تعريف المثال. الشروط لم تتغير حين اخترنا أولها؛ نحتاج تحديد الأولوية قبل استعمال الناتج، خصوصًا حيث تظهر True في أكثر من قناع للموضع نفسه.

احفظ اقتران الشرط باختياره

قائمتا الشروط والاختيارات متساويتان في عدد العناصر، وكل شرط يقابل اختيارًا. [1]

ننقل زوج (C2,B) قبل زوج (C1,A)، فيكون C2 أعلى أولوية الآن. عند 8 و12 نأخذ 53 و54؛ عند 3 يظل C1 الوحيد المطابق فنأخذ 0. النتيجة [-99,-99,0,53,54].

لكن لو نقلنا C2 قبل C1 وأبقينا قائمتَي الاختيارات A ثم B، صار C2 مقترنًا بـA وC1 بـB. عند 3 يختار الشرط الثاني قيمة B، وهي 52؛ وعند 8 و12 يختار الأول 23 و24 من A.

الناتج المختلف [-99,-99,52,23,24] سببه تغيير الاقتران، إضافة إلى نقل ترتيب الشروط. تساوي عدد الشروط والاختيارات لا يكشف هذا الخطأ؛ القائمتان ما زالتا من عنصرين.

نراجع بطاقة لكل قاعدة: اسم الشرط، وقناعه، واختياره، وموقعه في الأولوية. نقل القاعدة يعني نقل هذه العلاقة كاملة؛ أما تغيير اختيارها فهو تعديل مستقل يجب التصريح به.

في جدولنا المتساوي الأطوال، قيمة الاختيار تأتي من الموضع نفسه في A أو B. نحن لا نختار العنصر الأول من A لمجرد أن شرطها أول في القائمة؛ عند x=8 مثلًا الموضع 3 يعطي A عند الموضع 3، أي 23.

ميز البديل من صفر مختار

يوضع default حين تفشل جميع الشروط في الموضع. [1]

نجرب البديل صفرًا في مثال C1 قبل C2، فنحصل على [0,0,0,23,24]. الموضعان الأول والثاني بلا مطابقة، ولذلك جاء صفراهما من البديل. الموضع الثالث يطابق C1، وصفره من A.

إذن فحص الناتج لا يساوي صفرًا لا يعيد قناع المطابقات هنا. سيترك 23 و24 فقط، بينما عدد المواضع ذات مطابقة ثلاثة؛ الموضع الثالث أيضًا طابق قاعدة وأعطى قيمة صحيحة وفق مثالنا.

نحفظ مصدر الاختيار إن احتجنا تفسير كل خانة: بديل، بديل، A، A، A. هذه قائمة وصفية نؤلفها إلى جانب القيم؛ لا ندعي أن select تعيدها تلقائيًا مع الناتج.

اختيار −99 يفصل البديل عن القيم المختارة في هذا المثال تحديدًا، فيظهر [-99,-99,0,23,24]. لكنه ليس علامة غياب آمنة لكل بيانات؛ لو احتوت اختياراتنا −99 نفسها لتكرر الالتباس.

نراجع المطابقة من الشروط ونراجع القيمة من الاختيار. تغيير البديل يغير مواضع الفشل فقط في نموذجنا؛ لا يغير وجود C1 عند 3 أو يضيف شرطًا ينافسه.

مع البديل صفرًا، تعطي المواضع الأولى لقيم x سالب 4 و0 و3 الناتج صفرًا. الأولان من البديل بلا مطابقة، والثالث من A مع تحقق C1. قيم متساوية بمصادر مختلفة.
قيمة الصفر لا تخبر وحدها أي قاعدة طابقت.

اجعل سياسة النطاقات صريحة

where بثلاثة مدخلات يختار x عند True وy عند False. [2]

في نموذج قوائمنا، نكتب الاختيار المتدرج: إن تحقق C1 خذ A، وإلا إن تحقق C2 خذ B، وإلا خذ −99. يعيد ذلك [-99,-99,0,23,24]. وضع C2 أولًا في هذه الصياغة يعطي [-99,-99,0,53,54]. لم ننفذ استدعاء where متداخلًا أو نفحص توقيت تقييم تعبيراته.

إذا كانت السياسة المطلوبة «A من 3 إلى أقل من 8، وB من 8 فما فوق»، نجعل D1 يطابق 3<=x<8، وD2 يطابق x>=8. في قائمتنا يطابق D1 الموضع الثالث فقط، وD2 الموضعين الأخيرين.

الاختيار بين (D1,A) و(D2,B) لا يواجه موضعًا يطابقهما معًا. لذلك نقل الزوجين كاملين يبقي [-99,-99,0,53,54]. هذه سياسة تعطي B للنطاق الأعلى، وتختلف عن جعل C1 الواسع يفوز حيث يتداخل مع C2.

نفحص كل قناع منطقي ممكن لعدد من شرط إلى ثلاثة، وعدد من موضع إلى ثلاثة: 682 تركيبًا. لكل تركيب نجرب ثلاثة أنماط اختيارات: قيمًا مختلفة، وأصفارًا، وقيمًا متساوية بين الاختيارات؛ وبديلين −99 وصفرًا، فيكون المجموع 4092 حالة.

نقارن البحث عن أول True في كل موضع، بكتابة اختيارات القواعد من الأخيرة إلى الأولى، بحيث تحل القاعدة السابقة مكان اللاحقة. نراجع القيم ومصدرها والفشل الكلي وتحويل الأقنعة إلى نطاقات لا تتداخل تحفظ أولوية القاعدة الأصلية.

نقصر الفحص على قوائم أحادية متساوية الطول وقيم صحيحة وأقنعة منطقية. لم نشغل NumPy أو نفحص البث أو تحويل الأنواع أو التقييم الكسول أو NaN أو قائمة شروط خالية أو ذاكرة أو زمنًا.

xC1C2C1 قبل C2C2 قبل C1 مع اختياريهما
−4FalseFalse−99−99
0FalseFalse−99−99
3TrueFalse0 من A0 من A
8TrueTrue23 من A53 من B
12TrueTrue24 من A54 من B

للتوسع: الأبعاد والقطر والمنقول.

المراجع

  1. NumPy — select
  2. NumPy — where

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.