تعالج ravel_multi_index حدود فهارس المحاور ثم تحولها إلى فهارس مسطحة. [1] نختار wrap وC ونقارن حسابين مؤلفين.
حدد الشكل والإحداثيين
تحول ravel_multi_index فهارس المحاور إلى فهرس مسطح، مع معالجة حدودها. mode=wrap يتيح الالتفاف، وorder=C يختار ترتيب الصفوف. [1]
نؤلف شبكة من ثلاثة صفوف وأربعة أعمدة. الصفوف 0 و1 و2، والأعمدة 0 و1 و2 و3. نكتب الزوج (r,c) بوصفه رقم الصف ثم رقم العمود، ونقرأ الصف كاملًا قبل الانتقال إلى التالي.
للموضع الصالح (r,c)، فهرسنا المسطح هو 4r+c: الصف الأول مواضعه 0 إلى 3، والثاني 4 إلى 7، والثالث 8 إلى 11. هذه أرقام مواضع، ولا نضع قيمًا أو قياسات في الخانات.
نثبت الشكل والترتيب وسياسة الالتفاف معًا. إذا خرج إحداثي عن نطاق محوره، سنعيده إلى ذلك النطاق قبل حساب الرقم المسطح، ثم نقارن بهذه الخطوة اختصارًا مختلفًا.
قارن ترتيب العمليتين
نطلب (0,4). رقم الصف 0 صالح، لكن العمود 4 يقع بعد الأعمدة الأربعة. في نموذج الالتفاف نأخذ 0 mod3=0 للصف و4 mod4=0 للعمود. يصبح الزوج (0,0)، وفهرسه 0×4+0=0.
الاختصار المقابل يحسب أولًا الرقم الخام 0×4+4=4، ثم يأخذ باقيه على عدد الخانات 12. يبقى 4، وفك هذا الرقم في ترتيب الصفوف يعطي (1,0). وصلنا إلى أول عمود في الصف التالي، بدل أول عمود في الصف نفسه.
نجرب العمود السالب في الطلب (1,−1). الصف 1 يبقى 1، وباقي −1 على 4 هو 3 ضمن البواقي من 0 إلى 3. الزوج بعد الالتفاف (1,3)، والفهرس 1×4+3=7.
في الاختصار نحسب 1×4−1=3 ثم 3 mod12=3. هذا يشير إلى (0,3)، أي العمود الأخير من الصف السابق. النتيجتان 7 و3 تقعان في المجال الصحيح للرقم المسطح، لكنهما لا تصفان الخانة نفسها.
إذن صحة المجال وحدها لا تكفي. في المقارنة الأولى حمل تجاوز العمود إلى الصف التالي، وفي الثانية حمله إلى السابق. أما الالتفاف داخل العمود فأبقى رقم الصف الذي بدأنا منه، بعد معالجة حدوده هو أيضًا.
افهم متى يتفق الحسابان
نكتب صيغة نموذجنا لشكل موجب (m,n): k=(r mod m)×n+(c mod n). نختار الباقي غير السالب لكل محور. الصيغة المقابلة j=(r×n+c) mod(m×n) تعالج عددًا واحدًا بعد جمع المركبتين.
لتفسير الفرق، نقسم c قسمة إقليدية فنكتب c=q×n+t، حيث q هو الجزء الصحيح الأدنى من c/n، و0≤t<n. عندها يصبح الرقم الخام r×n+c=(r+q)×n+t.
لهذا يحمل j صفًا رقمه (r+q) mod m وعمودًا رقمه t، بينما يحمل k صفًا رقمه r mod m والعمود نفسه t. يتفق الرقمان إذا وفقط إذا كان q mod m=0. هذا اشتقاق مستقل للصيغتين، وليس ادعاءً عن تنفيذ المكتبة.
في الطلب (0,4) مع m=3 وn=4، نجد q=1، فلا يتفق الصفان. وفي (1,−1)، القسمة الإقليدية −1=(−1)×4+3 تعطي q=−1، وهو أيضًا ليس مضاعفًا لـ3.
لكن (0,12) يعطي q=3 وt=0، فيتفق الحسابان على الفهرس 0. كذلك (3,0) يعطي q=0؛ الصف 3 يلتف إلى 0 بالطريقتين. نجاح هذين الطلبين لا يلغي الخطأ الذي كشفه المثالان السابقان.
وفي نموذج k، زيادة r بمضاعف m أو c بمضاعف n تحفظ الموضع. مثلًا (1,−1) و(4,3) يعطيان (1,3) ثم 7. هذه هوية الخانة بعد الالتفاف، وليست دليلًا على أن الطلبين الأصليين متطابقان.

احفظ الطلب وحدود الفحص
احتفظ بالإحداثيين الأصليين إلى جانب الزوج بعد الالتفاف والفهرس المسطح. في مثالنا يشير (1,−1) و(4,3) إلى الخانة نفسها بعد المعالجة؛ حذف الأصل يجعل اختلاف الطلبين غير ظاهر في سجل الناتج.
للتحقق المستقل اخترنا 25 شكلًا: كل طول محور من 1 إلى 5. ولكل شكل أخذنا الإحداثيين من −9 إلى 9، أي 19×19=361 طلبًا. عدد الحالات 25×361=9025.
قارنّا حساب البواقي مع إضافة طول المحور أو طرحه تكراريًا، ثم مع موقع الزوج في قائمة إحداثيات مكتوبة صفًا بعد صف. راجعنا أيضًا المجال، وفك الفهرس بالقسمة والباقي، والثبات عند إضافة دورات المحاور، وشرط الاتفاق المشتق، وتطابق الإحداثيين المعالجين.
لكل حالة ستة فحوص، ومع ستة فحوص مباشرة صار الإجمالي 9025×6+6=54156. اختلف الحسابان في 4978 حالة ضمن المجال المفحوص؛ هذا عدد حالات النموذج، وليس معدل أخطاء برنامج أو بيانات واقعية.
النطاق بعدان موجبان وفهارس صحيحة وترتيب C مع التفاف المحورين. لم نشغل NumPy، ولم نفحص F أو clip أو raise أو سياسات مختلفة للمحورين، أو البث أو نوع البيانات أو بعدًا فارغًا أو الذاكرة والأداء. الفحوص تثبت حساب النموذج المحدد، ولا تمثل اختبارًا شاملًا لكل استدعاءات الدالة.
| الطلب المؤلف | الفهرس بعد لف المحورين | تسطيح ثم باقي 12 |
|---|---|---|
| (0,4) | 0 | 4 |
| (1,−1) | 7 | 3 |
| (0,12) | 0 | 0 |
| (3,0) | 0 | 0 |
للتوسع: الأبعاد والقطر والمنقول.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
