نمرر ثلاث دوال جمع إلى الغلاف على مصفوفة مؤلفة. نسجل أبعاد ما تعيده كل دالة، ثم نفصل صحة المجموع عن قبول ذلك الناتج داخل الغلاف.
شرط على أبعاد النتيجة
تتطلب apply_over_axes نتيجة بنفس عدد أبعاد المدخل أو أقل بواحد؛ تضيف محورًا في الحالة الثانية. [1] [2]
في التنفيذ المحدد، يفحص الغلاف الأبعاد بعد إضافة محور واحد، ويرفع ValueError إذا بقي العدد مختلفًا. [2]
نثبت في تجربتنا مدخلًا له بعدان ونمرر قائمة المحاور [0]. لكل دالة جمع نداء واحد؛ نسجل ما أعادته قبل أن يقبله الغلاف أو يرفضه.
سنقارن جمع كل القيم بجمع الأعمدة، ثم نضيف ضبطًا يحفظ المحور داخل دالة الجمع. الاختلاف الذي نختبره هو شكل نتيجة الدالة، مع بقاء مصفوفة المدخل والمحور المطلوب نفسيهما.
مجموع صحيح وغلاف يرفضه
شغّلنا NumPy 2.3.5 على CPython 3.12.14. كتبنا A=np.array([[-2,4,1],[6,5,-1]],dtype=np.int64). شكل A هو (2,3)، وعدد أبعادها اثنان. الأعداد مؤلفة وليست من المثال الوثائقي.
دالة الجمع الكلي تأخذ v وaxis، لكنها تعيد np.sum(v) دون استعمال axis. جمع الصف الأول -2+4+1=3، وجمع الثاني 6+5-1=10، والمجموع 13 في مرجع Python.
استدعينا np.apply_over_axes(global_sum,A,[0]) على هذه الدالة. سجلت الدالة أن مدخلها بالشكل (2,3) وأن axis يساوي 0؛ أعادت 13 من int64، بالشكل () وعدد أبعاد صفر.
بعد نداء الدالة رفع الغلاف ValueError. لذلك نحفظ 13 في خانة نتيجة الدالة المسجلة، ونحفظ الاستثناء في خانة نتيجة الغلاف؛ لم يعد الغلاف مصفوفة ناجحة بهذا العدد.
حساب 13 نفسه يوافق مرجع الجمع المؤلف. موضع الفشل في تجربتنا شرط أبعاد ناتج الدالة داخل الغلاف، وليس مساواة ذلك المجموع العددي بمرجعه.
نتيجة دالتنا ذات صفر من الأبعاد، والمدخل له بعدان. فرق العدد اثنان في هذه الحالة، بينما الضبط التالي سيعطي نتيجة أقل بواحد فقط.
دالة تنقص بعدًا وضبط يبقيه
في دالة جديدة أعدنا np.sum(v,axis=axis). عند axis=0 نجمع العمود الأول -2+6=4، والثاني 4+5=9، والثالث 1-1=0. المرجع [4,9,0] له ثلاثة مجاميع أعمدة.
سجلت الدالة هذه القيم من int64 بالشكل (3,) وعدد أبعاد واحد. أعاد الغلاف [[4,9,0]] بالشكل (1,3) من int64؛ صار عدد الأبعاد اثنين في الناتج المقبول.
في ضبط مستقل أعدنا np.sum(v,axis=axis,keepdims=True). سجلت الدالة [[4,9,0]] بالشكل (1,3) وعدد أبعاد اثنين؛ أعاد الغلاف القيم والشكل نفسيهما في هذا النداء.
إذن يصل الضبطان إلى [[4,9,0]]، لكن أحد السجلين يظهر دالة أعادت متجهًا أحادي البعد، والآخر يظهر دالة أعادت صفًا ثنائي الأبعاد بالفعل. سجل دالة الاستدعاء يميز الطريقين قبل نتيجة الغلاف.
شكل A هو (2,3)، بينما شكل الناتج (1,3). بقي عدد الأبعاد اثنين، ولم يبق طول محور الصفوف اثنين. الصف الناتج يحمل مجاميع الأعمدة، وليس نسخة من أحد صفي المدخل.
في المجموعات الثلاث فحصنا بقاء بايتات A كما كانت بعد استدعاء الغلاف. لا نسجل تعديل مدخل أو استعادة تفاصيله من المجاميع؛ نحفظ المدخل إلى جانب نتيجة كل دالة.

شبكة الشكل وحدود الدليل
كتب مرجع Python مجموع كل عمود بجمع عناصره، والمجموع الكلي بجمع الصفوف كلها. كتبنا الشكل المتوقع للناتجين المقبولين (1,n)، حيث n عدد أعمدة المدخل. لم نستعمل جمع NumPy أو الغلاف لإنتاج هذه المراجع.
للشبكة اخترنا الأشكال (1,1) و(1,2) و(2,1) و(2,2) و(2,3) و(3,2). لكل خانة إحدى القيم -2 و0 و3. عدد المصفوفات 3+9+9+81+729+729=1560.
أضفنا مصفوفة المثال ذات القيم 4 و1 و6 و5 و-1 خارج اختيارات الشبكة. صارت حالة إضافية، والإجمالي 1561 حالة.
لكل حالة ثلاث مجموعات: دالة الجمع الكلي تسجل عددًا بلا أبعاد ثم يرفضها الغلاف؛ دالة جمع المحور تنقص بعدًا ثم يقبلها؛ ودالة جمع المحور مع keepdims تبقي بعدين ويقبلها. راجعنا القيمة وشكلها ونوعها وأثر النداء على بايتات المدخل.
مرت 1561*3=4683 مجموعة. استدعينا apply_over_axes مرة لكل مجموعة؛ وفي دالة كل مجموعة نداء np.sum واحد، فعدد استدعاءات الغلاف 4683 وعدد نداءات الجمع داخل الدوال 4683 أيضًا. إنشاء المصفوفة والتحويلات لا تدخل هذين العددين.
في كل سجل راجعنا أن الدالة استقبلت المصفوفة الثنائية كاملة والمحور 0، وأنها استدعيت مرة واحدة مع axes=[0]. لا نستنتج سجل محاور متتابعة من تجربة المحور الوحيد.
النطاق مصفوفات int64 غير فارغة بالأشكال الستة المعلنة، وقيم صحيحة صغيرة منتهية، ودوالنا الثلاث التي تعيد عدد NumPy أو مصفوفة NumPy. لم نجعل الدوال تعيد كائنًا مخصصًا أو تغير المدخل.
لم نفحص محاور سالبة أو أخرى أو متعددة أو مكررة، أو مدخلًا قائمته Python بدل ndarray، أو مصفوفة فارغة أو مقنعة أو صنفًا فرعيًا، أو بيانات أعلى رتبة أو قيمة غير منتهية أو نوعًا آخر. لم نقس الأداء أو نشغّل إصدارًا أقدم.
عند مراجعة دالة ستضعها داخل الغلاف، سجل شكل ما تعيده وعدد أبعاده إلى جانب القيمة. ثم افحص نتيجة الغلاف نفسها؛ وجود حساب عددي صحيح في سجل الدالة لا يكفي وحده لإثبات نجاح الاستدعاء الكامل.
| دالة الجمع | نتيجة الدالة | نتيجة الغلاف |
|---|---|---|
| np.sum(v) | 13 / shape () | ValueError |
| np.sum(v,axis=axis) | [4,9,0] / shape (3,) | [[4,9,0]] / shape (1,3) |
| np.sum(v,axis=axis,keepdims=True) | [[4,9,0]] / shape (1,3) | [[4,9,0]] / shape (1,3) |
للتوسع: متوسط الجدول والمحور.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
