علوم وفضاء

putmask وplace: أي موضع يحدد قيمة الاستبدال؟

قناع واحد ونتيجتان للاستبدال.
قيم مسجلة على وجهتين من البداية نفسها.

أي عدّ يختار قيمة الاستبدال؟ [1][2]

موضعان لهما رقم مختلف

putmask تتبع الموضع المسطح عند تكرار القيم؛ place تتبع ترتيب مواضع True. [1][2]

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

الأعداد مؤلفة بلا وحدة وليست قياسات. نقرأ جدولنا صفًا فصفًا ومن اليسار إلى اليمين داخل الصف، ونبدأ عدّ النوعين من المواضع من صفر.

وجهان للمثال نفسه

أنشأنا A=np.array([[4,9,-2,7],[5,12,0,-3]],dtype=np.int64)، وm=np.array([[False,True,False,True],[True,False,False,True]],dtype=np.bool_)، وv=np.array([17,-6,31],dtype=np.int64). شكل A وm هو (2,4)، وشكل v هو (3,)، في NumPy 2.3.5 على CPython 3.12.14.

نسخنا A إلى p ثم شغّلنا np.putmask(p,m,v). رجع None؛ أصبحت p=[[4,−6,−2,17],[−6,12,0,−6]] من int64 وشكل (2,4). قرأنا الوجهة بعد الاستدعاء، ولم نضع قيمة الرجوع محلها.

نسخنا البداية نفسها إلى q ثم شغّلنا np.place(q,m,v). رجع None؛ أصبحت q=[[4,17,−2,−6],[31,12,0,17]] من int64 وشكل (2,4). لم نبدأ العملية الثانية من خرج الأولى.

في القراءة المسطحة، مواضع True هي n=1 و3 و4 و7. رتبها بين المختار هي r=0 و1 و2 و3. لذلك ليس n وr اسمين للعدد نفسه في هذه الحالة.

في مرجع putmask المؤلف، باقي قسمة n على 3 يختار موضع قيمة الاستبدال: البواقي 1 و0 و1 و1، فتصل القيم −6 و17 و−6 و−6. وفي مرجع place، بواقي r هي 0 و1 و2 و0، فتصل 17 و−6 و31 و17.

مثلًا الخانة (1,0) تحمل n=4 وr=2. حساب 4 mod 3=1 يقرأ v[1]=−6، وحساب 2 mod 3=2 يقرأ v[2]=31. ولهذا اختلفت قيمتها رغم اختيارها في الحالتين.

بقيت خانات False في الناتجين 4 و−2 و12 وصفر عند مواضعها الأصلية. وقارنا بايتات A وm وv قبل المسارين وبعدهما، فكانت متطابقة؛ الوجهتان المنفصلتان هما اللتان قرأنا فيهما التغيير.

شرط اتفاق في المرجع

تكرار الاستبدال مرتبط بموضع المصفوفة في putmask وبعدد المختار في place. [1][2]

نسمي طول قائمة الاستبدال L، ونفترض أنه موجب وقيمها مختلفة زوجيًا. في مرجع قوائمنا، الموضع المختار ذو الرقم المسطح n والرتبة r يأخذ v[n mod L] في المسار الأول وv[r mod L] في الثاني.

إذا تساوى الباقيان، قرأ المساران العنصر نفسه، فتساوت قيمة الخانة. وإذا اختلفا، قرآ عنصرين مختلفين من القائمة، وبفرض اختلاف قيمها تختلف قيمة الخانة. كل موضع غير مختار يأخذ البداية نفسها في المسارين.

إذن يتساوى خرجا المرجع كاملين إذا وفقط إذا n mod L=r mod L لكل موضع مختار، أو بصورة مكافئة يكون n−r مضاعفًا لـL في كل هذه المواضع. هذا استنتاج من تعريف مرجعنا وفرض القيم المختلفة.

في خانة n=4 وr=2 من المثال، الفرق 2 ليس مضاعفًا لـ3. لا يصح إعلان الاتفاق لأن القناع والشكل وعدد الخانات المكتوبة متساوية؛ قيم الخانات نفسها خالفت ذلك.

للتحكم، شغّلنا القناع كله True مع البداية وقيم الاستبدال نفسيهما. أعطى المساران [[17,−6,31,17],[−6,31,17,−6]] من int64 وشكل (2,4)، ورجع None. صار n=r في كل موضع، فوافق شرط المرجع.

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

الموضع المسطح ورتبة المختار وبواقيهما.
حساب الفهارس في المثال المؤلف.

فحص جميع الأقنعة وحدوده

المرجع قوائم Python أصلية؛ نمر على صفين وأربعة أعمدة، ونحسب n=4×رقم الصف+رقم العمود. نزيد r عند True فقط، ونضع قيمة البداية عند False. لا يستدعي المرجع putmask أو place أو reshape أو flat أو فهرسة قناع NumPy.

لثمانية مواضع منطقية لدينا 2**8=256 قناعًا، ومنها كله False وكله True. لكل قناع اختبرنا أطوال الاستبدال 1 و2 و3 و4 من بدايات القائمة [11,−7,23,5]. القيم في كل قائمة مختلفة؛ عدد الحالات 256×4=1024.

في كل حالة قارنا putmask وplace بمرجعي القوائم مع النوع int64 والشكل (2,4) ورجوع None. هذان فحصان. الثالث يراجع اتفاق الناتجين إذا وفقط إذا تحقق شرط البواقي، والرابع يراجع بقاء كل خانة False، والخامس يثبت بايتات البداية والقناع والقيم.

أضفنا الفحوص الخمسة نفسها للمثال المعروض، وخمسة للتحكم بقناع كله True. الإجمالي 1024×5+10=5130، ومرت جميع الفحوص في التشغيل المسجل. شرط الاتفاق مبرهن داخل نموذجنا؛ فحص المكتبة محدود بالحالات المختبرة.

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

احفظ قائمة الاستبدال والقناع وترتيب القراءة مع الوجهة قبل التشغيل وبعده. عدد الخانات التي تغيرها عملية لا يكفي لتحديد القيم التي وضعتها فيها.

n المسطحr المختارputmask / place
10−6 / 17
3117 / −6
42−6 / 31
73−6 / 17

للتوسع: القناع وقيمة البداية.

المراجع

  1. NumPy 2.3 — putmask
  2. NumPy 2.3 — place

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