choose تقرأ قيمة الاختيار بعد البث. [1]
رقم المصدر وموضع القيمة
choose تستخدم رقم الاختيار وقيمته عند الموضع الموافق بعد البث إلى شكل مشترك. [1]
نختار في مثالنا عمودًا وصفًا وعددًا بلا محاور، ونكتب خريطة أرقام المصادر قبل قراءة النتيجة. كل الأعداد مؤلفة بلا وحدة، ولا تمثل سجلًا أو قياسًا.
نراجع سؤالين في المثال: أي اختيار يحدده الرقم، وأي قيمة نقرأ منه عند عنوان الناتج؟ إعطاء رقم الاختيار وحده لا يحدد قيمة ثابتة لكل المواضع إذا كان الاختيار يحتوي قيمًا متعددة.
عمود وصف وقيمة واحدة
أنشأنا I=np.array([[0,1,2],[1,2,0]],dtype=np.int64)، ثم c0=np.array([[8],[-3]],dtype=np.int64)، وc1=np.array([[14,-5,9]],dtype=np.int64)، وc2=np.array(27,dtype=np.int64). شغّلنا NumPy 2.3.5 على CPython 3.12.14.
شكل I هو (2,3)، وشكل c0 هو (2,1)، وشكل c1 هو (1,3)، وشكل c2 هو (). وضعنا الاختيارات في قائمة Python [c0,c1,c2]؛ رقم 0 يحيل إلى c0، ورقم 1 إلى c1، ورقم 2 إلى c2.
broadcast_arrays تبث المدخلات بعضها مقابل بعض. [2]
لتحكم القراءة نفذنا np.broadcast_arrays(I,c0,c1,c2). سجلنا أربعة مدخلات موسعة من int64، شكل كل منها (2,3). بقيت قيم I كما كتبناها؛ c0 أصبحت [[8,8,8],[−3,−3,−3]]؛ c1 أصبحت [[14,−5,9],[14,−5,9]]؛ وc2 ظهرت [[27,27,27],[27,27,27]]. لم نكتب في هذه المخرجات.
نفذنا O=np.choose(I,[c0,c1,c2]) دون تغيير السياسة الافتراضية. أعادت [[8,−5,27],[14,27,−3]] من int64 وشكل (2,3).
عند (0,1) نجد I=1، فنقرأ c1 الموسعة عند ذلك الموضع: −5. وعند (1,0) نجد أيضًا I=1، لكن الموضع يشير إلى العمود 0 من c1، فنأخذ 14. تساوي رقم المصدر لم يجعل القيمتين متساويتين.
وعند (1,2) نجد I=0، فنأخذ −3 من الصف 1 في c0 الموسعة، لا 8 من صفها الأول. أما الموضعان ذوا الرقم 2 في المثال فيأخذان 27. لم نطلب إعادة c0 أو c1 كاملة في خانة واحدة.
تحكم بالتوسع وإعادة الترقيم
بنينا ثلاث مصفوفات صريحة من int64 على الشكل (2,3)، قيمها هي الشبكات الثلاث السابقة. نفذنا choose مع I وهذه القائمة الموسعة، فأعادت O نفسها بالنوع والشكل نفسيهما. هذا تحكم يفصل قراءة الاختيار عن الحاجة إلى توسيع الأشكال المختصرة في الاستدعاء.
ثم غيرنا القائمة وحدها إلى [c1,c0,c2] وأبقينا I. سجلنا [[14,8,27],[−3,27,9]] من int64 وشكل (2,3). عند (0,1)، صار الرقم 1 يحيل إلى c0 الموسعة وقيمتها 8 في الصف 0؛ لم يعد يحيل إلى −5 في c1.
إذا أردنا حفظ الاختيارات الأصلية بعد هذا التبديل، نؤلف J=[[1,0,2],[0,2,1]] من int64. كل 0 أصلي صار 1، وكل 1 صار 0، وبقي 2 كما هو. شغّلنا np.choose(J,[c1,c0,c2])، فأعاد [[8,−5,27],[14,27,−3]] من int64 وشكل (2,3).
للموضع (1,2) مثلًا، كان I=0 يحيل إلى c0. الآن J=1 يحيل إلى c0 الموجودة ثانيةً في القائمة الجديدة، فتظل القيمة −3. لا نكتفي بتبديل أسماء في الرسم مع إبقاء أرقام لا تصف تلك الأسماء.
قارنا بايتات I وc0 وc1 وc2 قبل الاستدعاءات وبعدها، فبقيت متطابقة؛ بقيت الأشكال أيضًا (2,3) و(2,1) و(1,3) و(). كوّنا J جديدة ولم نعدل I. هذا فحص للمدخلات في تجربتنا، لا ضمان عام لاستقلال التخزين أو أثر كتابة لم ننفذها.

مرجع وحدود معلنة
مع ثلاثة اختيارات والسياسة الافتراضية raise، الأرقام الصالحة هي 0 و1 و2. [1]
في تحكمين منفصلين استبدلنا I[0,0] مرةً بـ−1 ومرةً بـ3، مع الاختيارات الثلاثة نفسها. رفع كل استدعاء ValueError. لم نقرأ ناتجًا جزئيًا بوصفه جدولًا مكتملًا، ولم ننفذ wrap أو clip في المقال.
مرجعنا يصنع ثلاث شبكات Python صريحة: قيمة العمود بحسب رقم الصف، وقيمة الصف بحسب رقم العمود، والعدد المفرد في كل خانة. عند (i,j) يقرأ الشبكة التي يحددها رقم I[i,j] في الموضع (i,j). لا يستدعي choose أو broadcast_arrays أو أي بث NumPy داخل حساب المرجع.
عددنا كل شبكة I من ست خانات، لكل خانة 0 أو 1 أو 2: لدينا 3**6=729 خريطة. جربنا خمس بطاقات قيم للاختيارات، بينها أصفار، وقيم متساوية بين المصادر، وتكرار داخل مصدر، وقيم سالبة. المجموع 729×5=3645 حالة صالحة.
لكل حالة ستة فحوص: خرج choose ونوعه وشكله؛ وقيم وأشكال تحكم broadcast_arrays؛ والتحكم بالشبكات الصريحة؛ وتبديل الاختيارات وحده مقابل مرجع مستقل؛ وتبديلها مع إعادة الترقيم مقابل الناتج الأصلي؛ وثبات بايتات المدخلات وأشكالها. أضفنا الستة نفسها للمثال والتحكمين غير الصالحين: 3645×6+6+2=21878، ومرت جميعها.
تساوي قيم المصادر في بعض البطاقات قد يخفي تغير مصدر خانة حين ننظر إلى العدد فقط. نحفظ الخريطة المعلنة مع الشكل، ولا نستنتج هوية المصدر من تشابه قيمته مع قيمة أخرى.
نقصر النتيجة على ثلاثة اختيارات من int64 بالأشكال المعلنة وخريطة (2,3). استبعدنا الأشكال والأنواع والأعداد الأخرى للاختيارات، وسياسات wrap وclip وout، والفئات المشتقة والفراغ والخطوات الأخرى، والكتابة عبر ذاكرة مشتركة والتقييم الكسول والأداء وحجم الذاكرة. والتحكمان غير الصالحين لا يشملان كل بطاقة فهارس خاطئة.
| الموضع | رقم I | المصدر | القيمة المسجلة |
|---|---|---|---|
| (0,0) | 0 | c0[0,0] | 8 |
| (0,1) | 1 | c1[0,1] | -5 |
| (0,2) | 2 | c2 | 27 |
| (1,0) | 1 | c1[0,0] | 14 |
| (1,1) | 2 | c2 | 27 |
| (1,2) | 0 | c0[1,0] | -3 |
للتوسع: الأبعاد والعناصر.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
