نقارن الحشو المباشر بالنقل قبله، ثم نستعيد المحاور.
الجهات والمحاور
constant_values تحدد ثوابت الجهات لكل محور؛ ترتيب معالجة المحاور يؤثر في الزوايا. [1] [3]
تكتب أزواج pad_width عدد المواضع قبل كل محور وبعده. في constant_values يحدد كل زوج قيمة الحشو لجهتي ذلك المحور. [1]
الخاصية .T تنقل المصفوفة؛ النقل الثنائي يبدل الصفوف والأعمدة. [2] [4]
نعكس أزواج العرض والثوابت، ثم نعيد نقل الخرج لترتيب الأصل.
constant يعالج المحاور تصاعديًا؛ _view_roi يستبعد زوايا المحاور اللاحقة مبكرًا، و_set_pad_area يكتب ثابتي الجهات. [3]
المجال المبكر يستبعد الزوايا هنا؛ لا ندعي كتابة ثابت ثم استبداله فيها. [3]
زوايا مختلفة
على NumPy 2.3.5، حشونا A=[[5,-3,8],[2,7,-4]] بعرض ((1,2),(2,1)) وثوابت ((11,17),(23,29))؛ الشكل (5,6) والنوع int64.
شغلنا NumPy 2.3.5 على CPython 3.12.14. عرض محور الصفوف يضيف صفًا قبل الأصل وصفين بعده؛ عرض محور الأعمدة يضيف عمودين قبله وعمودًا بعده. المجموع خمسة صفوف وستة أعمدة.
الثابتان 11 و17 للصفوف المضافة، والثابتان 23 و29 للأعمدة المضافة. هذه أعداد مؤلفة بلا وحدة، ولا تمثل قياسات محيطة بالمصفوفة الأصلية.
import numpy as np A=np.array([[5,-3,8],[2,7,-4]],dtype=np.int64) width=((1,2),(2,1)) constants=((11,17),(23,29)) direct=np.pad(A,width,mode="constant",constant_values=constants) transposed=np.pad(A.T,width[::-1],mode="constant", constant_values=constants[::-1]) restored=transposed.T print(direct) print(restored) [1] [2] [3] [4]
في الحشو المباشر، الخانة (0,0) تساوي 23؛ نقل المدخل أولًا مع عكس أزواج العرض والثوابت، ثم إعادة نقل الخرج، أعطاها 11.
ظهر الصف الأعلى في direct بالقيم [23,23,11,11,11,29]. وفي restored صار [11,11,11,11,11,11]. بقيت الخانات الثلاث الواقعة فوق أعمدة الأصل مساوية 11؛ الذي تغير خانتا اليسار وخانة اليمين.
بعد نقل A أصبح شكل المدخل (3,2)، وصار عرض الحشو ((2,1),(1,2)) والثوابت ((23,29),(11,17)). خرج الحشو بالشكل (6,5)، ثم أعاد .T شكل (5,6).
الصفان السفليان في direct هما [23,23,17,17,17,29]، وفي restored هما [17,17,17,17,17,17]. لكل منهما ثلاث خانات زاوية مختلفة، فتكون الخانات المختلفة 3+3+3=9.
الصفان اللذان يحويان الأصل بقيَا [23,23,5,-3,8,29] و[23,23,2,7,-4,29] في المسارين. تطابقت قيم A الست وشرائط الحشو خارج الزوايا. لا ننسب الفرق إلى تغيير الأعداد الداخلية أو عدد الخانات.
تحكم موحد
تحكم بثابت 7 في الجهات الأربع أعطى المصفوفة نفسها في المسارين؛ بقاء العرض غير متناظر لم يمنع الاتفاق.
أنشأنا A جديدة بالقيم نفسها، وثبتنا العرض ((1,2),(2,1)). جعلنا الثوابت ((7,7),(7,7))، ثم نفذنا المسارين مع عكس زوجي العرض والثوابت في المسار المنقول.
في المسارين، الصف الأعلى والصفان السفليان ست قيم 7 لكل صف. الصفان الداخليان [7,7,5,-3,8,7] و[7,7,2,7,-4,7]. شاهدنا الاتفاق في جميع المواضع الثلاثين، بنوع int64 وشكل (5,6).
كل زاوية في المثال الرئيسي تقابل جهتين لهما ثابتان مختلفان؛ في التحكم كلا الثابتين 7. لذلك لا يظهر اختلاف قيمة حين يتغير أي محور يحدد الزاوية.
في نموذجنا ذي العروض الموجبة، يتطلب اتفاق جميع الزوايا الأربع أن يتفق ثابت الصف الأعلى مع ثابتي الأعمدة، وأن يتفق ثابت الصف الأسفل معهما أيضًا. يختزل الشرط إلى تساوي الثوابت الأربعة. هذا استنتاج من نموذج الإحداثيات المحدد، وليس فحصًا لكل نمط حشو.

مرجع وحدود
مرت 83 حالة و166 نداء pad و4980 عنصر خرج أمام مرجع إحداثي صحيح مستقل؛ اتفق المساران في 4 حالات واختلفا في 79.
ثبتنا A والعرض طوال الشبكة، واخترنا كل ثابت من {-2,0,3}. العدد 3⁴=81 تركيبًا للثوابت الأربع؛ أضفنا المثال (11,17,23,29) والتحكم (7,7,7,7) خارج الشبكة، فصار العدد 83.
لكل حالة نداءا np.pad فقط: الحشو المباشر والحشو للمدخل المنقول. العدد 83*2=166. إنشاء المصفوفة وقراءة .T مرتين لكل حالة خارج هذا العدد؛ سجلنا 166 قراءة للخاصية منفصلة.
كل نداء pad يعيد ثلاثين عددًا؛ مجموع عناصر الخرج 83*2*30=4980. نقل خرج المسار الثاني لا يضيف ثلاثين أخرى إلى هذا العد، إذ نراجع عناصر خرج الحشو نفسه بعد ترتيبها.
بنى المرجع قوائم Python وأعدادًا صحيحة، واختبر موضع كل صف وعمود. للمباشر يختار ثابت العمود إذا كان العمود خارج الأصل، وإلا ثابت الصف الخارجي، وإلا قيمة الأصل. للمسار المستعاد يبدأ باختبار الصف قبل العمود. لا تنتج دالة NumPy قائمة المتوقع.
قارننا كل خرج بالمرجع مساواة تامة، وحفظنا الشكل والنوع؛ لم نستخدم تسامحًا عائمًا. تحققنا أن أي اختلاف بين المسارين يقع ضمن الخانات التسع التي هي خارج الصفوف والأعمدة الأصلية معًا. قد تتفق بعض هذه الخانات إذا تساوى ثابتَاها.
ثلاث حالات شبكة كانت ثوابتها الأربعة متساوية: كلها −2، أو كلها صفر، أو كلها 3. اتفق فيها المساران، وأضاف التحكم حالة رابعة؛ بقيت 79 حالة مختلفة بينها المثال الرئيسي.
أنشأنا A جديدة لكل حالة وقرأنا AT=A.T مرة واحدة قبل النداءين، ثم أعدنا استخدام المدخلين. فحصنا بايتات A وAT بعد كل نداء pad وبقيت كما كانت؛ لم نقس على حدة تغير القيم أو النوع أو الشكل، ولم نختبر ملكية الذاكرة.
النطاق مصفوفة int64 ذات شكل (2,3)، وconstant، وعروض موجبة ثابتة وغير متناظرة، وأعداد صغيرة. لا يشمل أنواعًا أخرى أو محاور فارغة أو عرضًا صفريًا أو أنماط انعكاس أو إحصاء أو الأداء. لا نحول اتفاق التحكم إلى قاعدة أن النقل والحشو يتبادلان الترتيب دائمًا.
| الخانة | الحشو المباشر | النقل ثم الحشو |
|---|---|---|
| (0,0) | 23 | 11 |
| (0,5) | 29 | 11 |
| (4,0) | 23 | 17 |
| (4,5) | 29 | 17 |
للتوسع: أبعاد المصفوفة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
