تقنية

place: هل ترفض قائمة استبدال فارغة دائمًا؟

القناع وحالة النداء والوجهة.
قائمة فارغة وتحكم معلوم.

نجحت place في تجربتنا مع قيم استبدال فارغة عندما كان القناع كله False، ورفعت ValueError عندما اختار القناع موضعين. بقيت الوجهة ثابتة في الحالتين؛ سنفصل حالة النداء عن الأعداد الباقية.

اربط فراغ القيم بمواضع الكتابة

تشترط place قائمة قيم غير فارغة عندما يختار القناع عناصر للكتابة. [1]

نؤلف وجهة قصيرة من ثلاثة أعداد صحيحة، وننشئ قناعًا مطابقًا لها. نبدأ كل محاولة من وجهة جديدة بالقيم نفسها؛ لا نبني حالة الرفض من نتيجة محاولة ناجحة سابقة.

القناع كله False يختار صفر مواضع. نقارنه بقناع يختار موضعين، مع إبقاء قائمة قيم الاستبدال فارغة في الحالتين. بذلك نعزل سؤال فراغ القائمة عن تغيير نوع الوجهة أو إدخال فهارس خاطئة.

نحفظ سجلين: هل عاد النداء أو رفع خطأ، وما القيم التي بقيت في الوجهة؟ ثبات الوجهة وحده لا يكفي للتمييز بين النجاح بلا كتابة والرفض في تجربتنا.

قارن النجاح والرفض على قائمة فارغة

شغّلنا NumPy2.3.5 على CPython3.12.14. أنشأنا a=np.array([191,-195,0],dtype="<i8")، وv=np.array([],dtype="<i8"). شكل الوجهة(3,)، وشكل قيم الاستبدال(0,).

مع m=np.array([False,False,False],dtype=np.bool_) نفذنا np.place(a,m,v). عاد النداء بقيمة None، وبقيت الوجهة[191,−195,0] من int64 بالشكل(3,). قارنا بايتاتها قبل المحاولة وبعدها فكانت متطابقة.

نجحت هذه المحاولة دون قيم تُكتب. لا نصف None بأنها مصفوفة ناتجة خالية؛ إنها قيمة رجوع النداء، بينما قرأنا الأعداد من الوجهة القائمة بعده.

ثم أنشأنا وجهة جديدة من[191,−195,0] وقناعًا[True,False,True] من bool، وأبقينا v فارغة. رفع np.place خطأ builtins.ValueError؛ حفظنا نوعه ورسالة التنفيذ.

بعد التقاط الخطأ بقيت الوجهة[191,−195,0] وبايتاتها ونوعها وشكلها ثابتة في هذا النداء. لم يرجع النداء بنجاح، ولم نضع None في سجل الرفض أو ننسب إليه قائمة نتائج عددية.

البداية والنهاية العددية متساويتان في الحالتين، وحالة النداء مختلفة. لذلك نقرأ الحالة مع الأعداد بدل جعل الأعداد الباقية دليلًا على نجاح كل محاولة.

ضع تحكمًا يكتب قيمة معلومة

للتحكم أنشأنا وجهة ثالثة تبدأ[191,−195,0]، وقناعًا[False,True,False] من bool، ومصفوفة قيم[200] من int64 بالشكل(1,). اخترنا200 عددًا مؤلفًا، وليس تقديرًا لقيمة مفقودة.

عاد np.place بقيمة None، وأصبحت الوجهة[191,200,0] من int64 بالشكل(3,). تغير الموضع الأوسط الذي اختاره القناع، وبقي الأول والثالث بقيم البداية.

يفصل هذا التحكم بين None وبين عدم التغيير: رجعت None في النجاح بلا كتابة، ورجعت None أيضًا في النجاح الذي كتب200. لمعرفة الأثر نقرأ الوجهة بعد النداء ونقارنها بالبداية.

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

الرسم الأول يعرض حالتي القائمة الفارغة، مع None في صف النجاح وValueError في صف الرفض. والرسم الثاني يضيف التحكم الذي كتب قيمة، ويميز عدّ النداءات عن عدّ الأعداد التي سجلناها من الوجهة.

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

عدد النداءات ومشاهدات الوجهة.
None والخطأ وأعداد مسجلة.

عد المحاولات ومشاهدات الوجهة

اخترنا n من191 إلى207، أي17 قيمة. لكل n بدأنا ثلاث وجهات مستقلة من[n,−n−4,0]. الحالة الأولى قائمة فارغة مع القناع كله False؛ والثانية قائمة فارغة مع[True,False,True]؛ والثالثة قيمة[n+9] مع[False,True,False].

عدد المحاولات17×3=51. رجعت34 محاولة بنجاح بقيمة None، ورفعت17 محاولة خطأ ValueError. أنشأنا51 مصفوفة وجهة جديدة، لكن بداياتها تمثل17 نمط قيم مختلفة، مكررًا في الحالات الثلاث.

لا توجد قيمة رجوع عددية أو منطقية من النداءات المستهدفة. سجلنا ثلاثة أعداد من كل وجهة قبل المحاولة وثلاثة بعدها:51×3×2=306 مشاهدات عددية لحالة الوجهة؛ ليست306 عنصرًا أعادته الدالة.

بنى مرجع Python التوقع قبل استيراد NumPy. إذا اختار القناع مواضع مع قائمة فارغة، صنف الحالة رفضًا في هذا المجال؛ وإلا أبقى البداية أو كتب قيمة التحكم عند الموضع المختار. لا تستدعي هذه القاعدة place لبناء توقعها.

تحقق struct من بايتات الوجهة والقناع وقيم الاستبدال عند البناء، ثم من حالة الوجهة بعد المحاولة. طابقت الحالات والأعداد المرجع، وحفظنا سجلات None والاستثناءات منفصلة عن الأعداد الملتقطة من المصفوفات.

الأعداد والقناع والقيم مؤلفة بلا وحدة. لم ننفذ عملية تنظيف أو نحسب سبب غياب قيم الاستبدال. النجاح التقني أو الرفض لا يقرر ملاءمة قيمة200 لبيانات واقعية.

اقتصرنا على وجهة int64 بمحور واحد وطول ثلاثة، وقناع bool مطابق، وقيم int64 فارغة أو ذات عنصر واحد. لم نفحص تحويل الأنواع أو أشكالًا وأطوالًا أخرى أو أقنعة غير مطابقة أو القراءة فقط أو التداخل أو الفئات المشتقة أو الأداء أو إصدارًا آخر.

MaskValuesCallDestination after
FFFemptyNone191 / -195 / 0
TFTemptyValueError191 / -195 / 0
FTF200None191 / 200 / 0

للتوسع: القناع والتهيئة.

المراجع

  1. NumPy place

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