علوم وفضاء

ndindex: هل الشكل () يعني غياب المواضع؟

شكل بلا محاور يعطي موضعًا بلا مكونات.
قائمة المرور [()] تحتوي عنصرًا واحدًا.

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

شكل المدخل وإحداثيات الناتج

تولد ndindex tuples من إحداثيات الشكل، مع تحريك المحور الأخير أولًا؛ يمكن تمرير الأطوال منفصلة أو داخل tuple. [1] [2]

التنفيذ المحدد يفك وسيط tuple إلى أطوال الشكل، ويستعمل مكررًا يسمح بالحجم الصفري؛ كل خطوة تعيد multi_index. [2]

يسجل اختبار الإصدار المحدد موضعًا فارغًا للشكل الخالي، ولا مواضع لمحور طوله صفر. [3]

نميز هنا شكلًا بلا محاور عن شكل له محور بلا خانات. نكتب قائمة المواضع وعدد عناصرها وطول كل tuple؛ عدم وجود مكونات في موضع لا يعني تلقائيًا عدم وجود ذلك الموضع.

قائمة فيها موضع فارغ

شغّلنا NumPy 2.3.5 على CPython 3.12.14. مررنا tuple الشكل () إلى np.ndindex، وجمعنا المكرر في قائمة: الناتج [()] وعدد المواضع 1.

القوسان المربعان يحفظان قائمة المرور؛ داخلهما عنصر واحد هو tuple فارغة (). طول هذا العنصر صفر، لكنه ما زال عنصرًا في القائمة. القائمة [] مختلفة: ليس داخلها أي موضع.

في تحكم مستقل أنشأنا np.ndindex() دون أي وسيط. جمعه أعطى [()] أيضًا، موضعًا واحدًا بلا مكونات. بعد جمع كل من المكررين، رفع طلب next جديد StopIteration.

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

المحور الصفري والتحكم الموجب

مررنا (0,) كوسيط tuple منفرد. أعادت list(np.ndindex((0,))) القائمة []، وعدد المواضع صفر. لم نحصل على tuple موضع تحتوي الصفر؛ الصفر هنا طول المحور في الشكل.

اخترنا شكلًا إضافيًا من تأليفنا هو (2,0,4). أعطى [] أيضًا. المحور الأوسط لا يتيح أي فهرس؛ لذلك لا يوجد موضع كامل نستطيع كتابة مكوناته الثلاثة ضمن الحدود.

في مرجعنا، الفهرس على محور طوله صفر يجب أن يحقق 0<=i<0، ولا يحقق أي عدد هذا الشرط. وجود أطوال 2 و4 في المحورين الآخرين لا يوفر مكونًا صالحًا للمحور الأوسط.

للضبط الموجب اخترنا (2,1). أعاد المكرر [(0,0),(1,0)]: الفهرس الأول 0 ثم 1، والفهرس الأخير 0 في الموضعين. عدد المواضع 2، وطول كل tuple يساوي 2.

أعادت np.ndindex(2,1) الموضعين نفسيهما بعد جمعها، كما أعادت np.ndindex(2,0,4) القائمة الخالية. كل محاولة تبدأ بمكرر جديد؛ لم نستعمل مكررًا سبق استهلاكه كتحكم.

للمكرر ذي المواضع ننفد بعد جمعها، وللمكرر الصفري لا توجد خطوة أولى ناجحة. فحص next بعد الجمع رفع StopIteration في هذه المحاولات جميعًا.

محور طوله صفر يعطي لا مواضع، وضبط موجب يعطي موضعين.
نميز [] من [()] ونحفظ طول الإحداثيات.

من تعداد البوادئ إلى عدد المجموعات

بدأ مرجع Python بقائمة فيها إحداثيات فارغة واحدة [()]. لكل طول محور وسع كل بادئة بإلحاق الأرقام المسموحة من صفر حتى أقل من الطول. هذا بناء مؤلف لا يستدعي ndindex لتوليد المتوقع.

إذا لم يوجد محور، لا توجد خطوة توسعة فتظل [()]. إذا وصل طول محور صفر، لا توجد قيمة تُلحق بالبوادئ فتصير القائمة []. المحاور التالية لا تنشئ موضعًا من بادئة اختفت.

راجعنا العدد بجداء الأطوال، بدءًا من 1 قبل أي محور. لا عوامل للشكل ()، فيبقى العدد 1 في مرجعنا؛ عامل صفر في (2,0,4) يجعل العدد صفرًا.

للشبكة أخذنا الرتب من صفر إلى أربعة، ولكل محور طولًا من 0 إلى 3. عدد الأشكال 1+4+16+64+256=341، بما فيها الشكل بلا محاور والأشكال ذات أطوال صفرية.

أضفنا (2,0,4) الذي يحمل طول 4 خارج أطوال الشبكة، فصار الإجمالي 342 شكلًا. لكل شكل نداء بوسيط tuple وآخر بأطوال منفصلة: 342*2=684 مجموعة. التحكم المستقل بلا وسائط أضاف مجموعة واحدة، فمرت 685 مجموعة.

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

يحفظ ملف التحقق JSON tuple الموضع الخالية كقائمة داخلية []، فتظهر قائمة المرور ذات الموضع الواحد على صورة [[]]. يحدد طول القائمة الخارجية عدد المواضع؛ لا نخلط هذه الكتابة مع القائمة الخارجية [].

النطاق أطوال Python صحيحة غير سالبة ورتب قصيرة، والشكل الإضافي المعلن. لم نفحص أطوالًا سالبة أو غير صحيحة أو كائنات مخصصة أو أشكالًا كبيرة، ولا قراءة أو كتابة مصفوفة أو نوع بيانات أو عناوين تخزين.

لم نستعمل ndincr أو نقس الأداء أو نشغّل إصدارًا أقدم. عند مراجعة سجل مشابه، احفظ الشكل وعدد المواضع وطول الموضع نفسه؛ هذه ثلاثة أوصاف مختلفة في مثالنا.

شكل النداءقائمة المواضععددها
ndindex(())[()]1
ndindex((0,))[]0
ndindex((2,0,4))[]0
ndindex((2,1))[(0,0),(1,0)]2
ndindex()[()]1

للتوسع: ترتيب الفهرسة ونقل المحاور.

المراجع

  1. NumPy ndindex
  2. NumPy 2.3.5 ndindex implementation
  3. NumPy 2.3.5 ndindex tests

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