أعطى المرور على شريحتنا أربعة أزواج؛ إعادة فهارسها مباشرة إلى الأصل قرأت أربع قيم مختلفة.
اربط الإحداثيات بالمدخل
تولد ndenumerate أزواجًا من الإحداثيات والقيم للمدخل. [1] في تجربة الشريحة نحفظ رابط الموضع المحلي بالأصل استقلالًا.
نسأل عن سجل يتضمن رقم صف ورقم عمود وقيمة. قد تبدو هذه الثلاثة كافية للرجوع إلى البيانات، لكنها تحتاج أيضًا إلى اسم الجدول الذي تخصه. نكتب هنا A للأصل وB للمدخل الذي سنمر عليه.
العد من صفر لا يجعل الصفر اسم أول صف من كل نسخة في الوقت نفسه. إذا تغير ترتيب الصفوف بين مدخلين، فقد يحمل الصف المحلي 0 قيم صف كان رقمه مختلفًا في المصدر الذي بدأنا منه.
نؤلف الأعداد للتعليم، ولا ننسبها إلى قياسات أو أشخاص. نتابع تحويلًا محددًا يمكن كتابة مواضعه، دون إثبات هوية سجل حقيقي أو سياسة لمعالجة بيانات غائبة.
هدفنا التمييز بين إحداثيات المرور على مدخل وبين خريطة رجوع إلى مدخل سابق. وجود الزوج الصحيح في B لا يثبت أن قراءة A بالرقمين نفسيهما تعطي القيمة نفسها.
اقرأ أزواج الشريحة
أنشأنا A=np.array([[8,-1,3],[2,6,0]],dtype=np.int64)، ثم B=A[::-1,::2]. في NumPy 2.3.5 على CPython 3.12.14 كانت قيم B هي [[2,0],[8,3]]، والنوع int64، والشكل (2,2).
الصف الأخير من A يسبق الأول في اختيارنا، ومن كل صف أخذنا العمودين الأصليين 0 و2. لذلك صف B الأول يحمل 2 ثم صفرًا، والثاني 8 ثم 3. لم يدخل −1 أو 6 من العمود الأصلي 1.
نفذنا np.ndenumerate(B). سجلنا بالترتيب: ((0,0),2)، ثم ((0,1),0)، ثم ((1,0),8)، ثم ((1,1),3). هذا ترتيب شوهد في التنفيذ المحدد، ولا نجعله وعدًا عامًا بترتيب كل واجهات المرور أو أنواع التخزين.
الزوج الثاني يحمل صفرًا عند (0,1). مررنا على الخانات الأربع، ولم نضع شرطًا غير صفري في الحلقة. حذف هذا الزوج من جدولنا سيحوّل السجل إلى سجل مختلف عما خرج من المحاولة.
راجعنا عدد المواضع وتفردها وحدودها: أربعة مواضع محلية مختلفة، ولكل مكون مجال من 0 إلى 1. عدد العناصر هنا حاصل ضرب بعدي B، وليس عدد الخانات غير الصفرية في A.
كانت خاصية B.flags.c_contiguous تساوي False في المثال. نسجل هذه الملاحظة مع ترتيب الأزواج الذي شاهدناه، ولا نحسب عناوين الذاكرة أو نستنتج أن الحلقة رتبتها تصاعديًا. هذه مسألة لم يقسها فحصنا.
حوّل الموضع قبل الرجوع
الخطوة السالبة تتجه نحو الفهارس الأصغر، وتطبق الشرائح على المحاور. [2]
في مثال صفين وأعمدة تؤخذ بخطوة اثنين، نكتب رابطنا إلى الأصل: B(i,j)=A(1-i,2j). رقم الصف المحلي 0 يعود إلى الصف الأصلي 1، ورقم الصف المحلي 1 إلى الأصلي 0. العمود المحلي 0 يعود إلى 0، والمحلي 1 إلى 2.
لذلك مواضع الأزواج الأربعة في A هي (1,0) و(1,2) و(0,0) و(0,2). قراءتها بهذا الترتيب تعيد 2 وصفرًا و8 و3. هذه صيغة مشتقة لاختيارنا المحدد، وليست قاعدة لأي شريحة ممكنة.
إذا قرأنا A عند (0,0) و(0,1) و(1,0) و(1,1) مباشرة، نحصل على 8 و−1 و2 و6. جميع الأرقام داخل حدود A، ومع ذلك اختلفت القراءات الأربع عن أزواج B. صلاحية الفهرس من حيث المجال لا تثبت صحة علاقته بالنسخة المقصودة.
أنشأنا تحكمًا مستقلًا C من قوائم Python بالقيم [[2,0],[8,3]] وبنوع int64. أعطى المرور عليه الأزواج المحلية الأربعة نفسها في القيم والمواضع، وبقي النوع والشكل مثل B. القوائم حسبها مرجعنا؛ لم نبنِ C باستدعاء شريحة NumPy.
تساوي الأزواج في B وC لا يحمل وحده خريطة التاريخ التي أنشأت كل مدخل. نحفظ صيغة إنشاء B إذا أردنا الرجوع إلى A؛ قائمة الأزواج ليست دليلًا على أن أي مدخل آخر مساوي القيم مشتق من A بالطريقة نفسها.
في حالة الجدول الصفري من شبكة فحصنا، قد تتفق القراءات دون تحويل لأن جميع القيم صفر. هذه المساواة لا تلغي اختلاف أرقام المواضع بين المحلي والأصل. لهذا لا نقصر التحقق على قيمة واحدة متكررة.

راجع المرجع وحدوده
بنى المرجع توقعات مستقلة بقوائم Python وحلقتين للصف والعمود. اختار الصف الأصلي r-1-i والعمود الأصلي 2j، ثم كتب قيمة ذلك الموضع مع الإحداثيين المحليين. لم يستخدم ndenumerate أو شريحة NumPy أو نسخها لبناء التوقع.
لعدد صفوف موجب r وعدد أعمدة موجب c في نطاقنا، بقيت r صفوف في الاختيار، وعدد الأعمدة المختارة هو طول قائمة 0 و2 و4 حتى أقل من c. هذا العد هو الذي حدد حدود العمود المحلي في المرجع.
اخترنا الصفوف من 1 إلى 3 والأعمدة من 1 إلى 4، مع استبعاد أي شكل يتجاوز ست خانات. الأشكال التسعة هي (1,1)، (1,2)، (1,3)، (1,4)، (2,1)، (2,2)، (2,3)، (3,1)، (3,2). لكل خانة قيمة −2 أو صفر.
لأشكال الصف الواحد 2+4+8+16=30 مدخلًا؛ ولأشكال الصفين حتى ثلاثة أعمدة 4+16+64=84؛ ولثلاثة صفوف حتى عمودين 8+64=72. المجموع 30+84+72=186 حالة. نحدد الأشكال صراحة بدل الادعاء بفحص جميع الجداول الصغيرة.
راجعنا ثمانية أمور لكل حالة: أزواج الشريحة؛ وقيمها وشكلها ونوعها؛ وتفرد الإحداثيات وحدودها؛ والتحويل إلى الأصل؛ والقراءة دون تحويل وعدد اختلافاتها؛ والتحكم المستقل المساوي القيم؛ والمرور على A كاملة؛ وبقاء بايتات المدخلين وشكلهما.
أضفنا ثمانية فحوص مماثلة للمثال الرئيسي وأربعة خاصة بقيمه ومواضع الأصل وقراءات الفهارس غير المحولة ووجود الصفر وخاصية التخزين المعلنة. الحساب 186×8+8+4=1500، ومرت كلها.
اقتصر التنفيذ على int64 وجداول ذات محورين بطولين موجبين والشريحة A[::-1,::2]. لم نفحص أنماط شرائح أخرى أو فهرسة متقدمة أو مدخلًا فارغًا أو مفردًا بلا محور أو أنواعًا وأبعادًا أخرى أو تعديل القيم أو مشاركة التخزين أو ترتيب عناوينه أو الأداء.
عند حفظ سجل المرور، اربط الإحداثيين بالمدخل الذي مررت عليه، واحفظ تحويله إلى المصدر عند الحاجة. التحقق من الحدود والقيم في المثال لا يعوض عن تحديد النسخة التي تقصد قراءتها.
| الموضع في B | الموضع في A | القيمة | A دون تحويل |
|---|---|---|---|
| (0,0) | (1,0) | 2 | 8 |
| (0,1) | (1,2) | 0 | -1 |
| (1,0) | (0,0) | 8 | 2 |
| (1,1) | (0,2) | 3 | 6 |
للتوسع: أبعاد المصفوفة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
