علوم وفضاء

fill_diagonal: هل يملأ قطر كل طبقة في المكعب؟

ثلاث طبقات؛ خلية واحدة مختارة في كل طبقة بالاستدعاء الكامل.
ثلاث كتابات في المكعب كله، مقابل تسع باستدعاءات الطبقات.

في fill_diagonal، تتساوى جميع فهارس الموضع القطري، ويتعدل المدخل دون قيمة معادة. [1]

سمِّ الفهارس الثلاثة

في fill_diagonal، تتساوى جميع فهارس الموضع القطري، ويتعدل المدخل دون قيمة معادة. [1]

نعلن الشكل (3,3,3)، ونسمي الفهرس (b,r,c): الأول يختار الطبقة، والثاني صفًا داخلها، والثالث عمودًا. هذا تفسيرنا التعليمي للمحاور؛ نبدأ الترقيم من صفر ونقرأ الأعداد من اليسار إلى اليمين. لا توجد وحدة قياس أو بيانات واقعية في المثال.

نريد التمييز بين طلبين: كتابة المواضع التي تتساوى فهارسها الثلاثة، وكتابة قطر الصف والعمود في كل طبقة مستقلة. في الطلب الثاني لا يشترط أن يساوي رقم الطبقة رقم الصف. كلمة «قطر» وحدها لا تحدد أي مجموعة منهما نقصد.

ثلاث كتابات للمكعب وتسع للطبقات

أنشأنا على NumPy 2.3.5 وCPython 3.12.14 مصدرًا من int64. قيمة الموضع (b,r,c) هي 2×(9b+3r+c)+1. الطبقة الأولى [[1,3,5],[7,9,11],[13,15,17]]، والثانية [[19,21,23],[25,27,29],[31,33,35]]، والثالثة [[37,39,41],[43,45,47],[49,51,53]].

نسخنا المصدر إلى A، ثم نفذنا np.fill_diagonal(A,-14). صار A[0,0,0] وA[1,1,1] وA[2,2,2] مساويًا لـ−14. كانت القيم الأصلية لهذه المواضع 1 و27 و53. لم يكتب الاستدعاء −14 في كامل أقطار الطبقات.

مثلًا A[0,1,1] بقيت 9، وA[1,0,0] بقيت 19، رغم أن الصف يساوي العمود في الموضعين. في الأول لا يساوي رقم الطبقة رقم الصف، وفي الثاني كذلك. هذه أمثلة داخل المدخل نفسه، وليست اختبارًا لعدم وجود قطر في الطبقة.

أنشأنا B بنسخة جديدة من المصدر، ونفذنا for b in range(3): np.fill_diagonal(B[b],-14). داخل كل طبقة نختار (0,0) و(1,1) و(2,2). لذلك عدد الكتابات 3×3=9؛ B[0,1,1] أصبحت −14، وB[1,0,0] أصبحت −14 أيضًا.

الفرق في المواضع والتعديل

تقاطعت مجموعتا الكتابة في (0,0,0) و(1,1,1) و(2,2,2). في الاستدعاءات المنفصلة توجد ستة مواضع أخرى: (0,1,1)، (0,2,2)، (1,0,0)، (1,2,2)، (2,0,0)، (2,1,1). اختلفت النتيجتان في هذه المواضع الستة فقط.

ظهرت None من الاستدعاء الكامل، ومن كل استدعاء لطبقة. راجعنا المصفوفتين بعد الاستدعاء؛ لا نخزن القيمة المعادة بوصفها مصفوفة جديدة. حافظ A وB على معرفيهما وعلى الشكل (3,3,3) والنوع int64، لكن عناصر مختارة فيهما تغيرت فعلًا.

المصدر المنفصل بقي ثابتًا. كما بقيت عناصر A خارج المواضع الثلاثة، وعناصر B خارج المواضع التسعة، على قيمها الأصلية. جميع قيم المصدر فردية، والتعبئة −14 زوجية؛ لذلك كل كتابة في مثالنا تظهر كتغير، ولا تخفيها مساواة القيمة القديمة بالجديدة.

لا نعد نجاح الاستدعاء جوابًا عن قصد المستخدم. إذا كانت المهمة تعبئة قطر كل جدول، فمجموعة المواضع المطلوبة هنا (b,i,i)، بينما الاستدعاء على المكعب كله نفذ مجموعة أصغر. نكتب أسماء المحاور والمجموعة المقصودة قبل تفسير النتيجة.

مقارنة مجموعتي المواضع: تساوي ثلاثة فهارس أو الصف والعمود.
مجموعة الطبقات تضيف ستة مواضع في مثالنا.

مرجع مستقل وحدود التجربة

بنى مرجع Python قوائم ثلاثية بحلقات على b وr وc. للطلب الكامل يضع القيمة إذا b==r==c؛ وللطبقات يضعها إذا r==c. لا يستدعي المرجع fill_diagonal أو diagonal أو diag_indices، ولا يستخدم شريحة NumPy في بناء القيم المتوقعة.

للشبكة أخذنا n من 1 إلى 5، والأشكال (n,n,n). قيمة المصدر 2×(n²b+nr+c)+1، والتعبئة من −8 وصفر و20. يوجد 5×3=15 إعدادًا؛ أضفنا المثال n=3 مع −14 منفصلًا، لأن قيمة تعبئته ليست من قيم الشبكة الثلاث.

لكل إعداد عشرة فحوص: النتيجتان كاملتان مقابل المرجع، ومجموعتا المواضع المتغيرة، وثبات غير المختار في كل طريقة، وNone من الاستدعاءات، والمعرفان مع الشكل والنوع، وثبات المصدر، وفرق المواضع مع احتواء مجموعة الطلب الكامل داخل مجموعة الطبقات. مرت 16×10=160 فحصًا.

في مرجعنا توجد n كتابة للطلب الكامل وn² للطبقات؛ الفرق n(n−1). عند n=1 لا توجد مواضع إضافية، فتتفق الطريقتان. وعند n>1 في الشبكة ظهر الفرق في القيم، لأن التعبئة الزوجية تختلف عن كل قيم المصدر الفردية. لا نعمم اتفاق القيم أو اختلافها إلى مصدر قد يساوي قيمة التعبئة أصلًا.

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

الطلبالمواضع في مثالناعدد الكتابات
المكعب كاملًا(i,i,i)3
كل طبقة منفصلة(b,i,i)9
الإضافي في الطبقاتb مختلف عن i6

للتوسع: الأبعاد والقطر والمنقول.

المراجع

  1. NumPy fill_diagonal

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