برمجة بايثونعلوم البيانات

كيفية جمع صفوف وأعمدة مصفوفة نمباي

دليل أكاديمي شامل يشرح كيفية جمع صفوف وأعمدة مصفوفات نمباي (NumPy) ثنائية ومتعددة الأبعاد باستخدام المحاور البرمجية وتحسين الأداء الحسابي.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 19 سبتمبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 19 سبتمبر، 2026
د. مروة عبد العظيم دكتوراه
أستاذة علم النفس جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

تُعد الحوسبة العلمية ومعالجة البيانات الرقمية الركيزة الأساسية التي تقوم عليها الثورة التقنية المعاصرة، بدءاً من نماذج التعلم الآلي والذكاء الاصطناعي، مروراً بالمحاكاة الفيزيائية المعقدة، وصولاً إلى تحليل البيانات الضخمة في العلوم الاجتماعية والاقتصادية. وفي قلب هذا النظام البيئي البرمجي المتقدم، تتربع مكتبة نمباي (NumPy) كحجر زاوية لا غنى عنه للغة بايثون، محولة إياها من مجرد لغة برمجة نصية مفسرة عامة الأغراض إلى بيئة حوسبة عددية فائقة الأداء تنافس لغات الحوسبة العتيدة مثل فورتران وسي. إن السر الدفين وراء هذا التحول الجذري يكمن في قدرة نمباي على توفير بنى معطيات متجهية متجانسة تسمح بإجراء الحسابات المصفوفية المعقدة بمعدلات سرعة استثنائية وبأقل قدر من استهلاك الموارد الحسابية.

تمثل عمليات التجميع الرياضي، وعلى رأسها جمع عناصر الصفوف والأعمدة في المصفوفات ثنائية ومتعددة الأبعاد، إحدى أكثر العمليات الحسابية تكراراً وأشدها خطورة في الوقت ذاته. فعلى الرغم من أن فكرة “الجمع” تبدو بديهية من الناحية الحسابية الابتدائية، إلا أن إسقاطها على بنية مصفوفية متصلة بالذاكرة يثير سلسلة من التساؤلات المعمارية والبرمجية الدقيقة: كيف يتعامل المعالج مع تنظيم الذاكرة عند التحرك عبر الصفوف مقارنة بالأعمدة؟ ما هو التفسير الدقيق لمفهوم “المحور” الحسابي الذي يشكل معضلة مفاهيمية شائعة لدى المبتدئين والمحترفين على حد سواء؟ وكيف يمكن للمطور تفادي كوارث طفحان الذاكرة الحسابي وفقدان دقة الفواصل العائمة دون التضحية بزمن التنفيذ؟

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

1. الأسس النظرية للعمليات الحسابية على مصفوفات نمباي

1.1 مفهوم البنية المتجانسة في كائنات ndarray

تتأسس القوة الحسابية لمكتبة نمباي على كائنها الجوهري المعروف باسم المصفوفة متعددة الأبعاد (ndarray). تختلف هذه البنية اختلافاً جذرياً عن قوائم بايثون القياسية (Python Lists)؛ فقوائم بايثون هي في واقع الأمر مصفوفات من المؤشرات التي تشير إلى كائنات بايثون متناثرة في الذاكرة العشوائية (RAM). يتطلب هذا النموذج المرجعي غير المتجانس طبقة إضافية من تفكيك المراجع (Dereferencing) وعمليات فحص النوع اللحظية (Type Checking) عند تنفيذ أي عملية حسابية بسيطة، وهو ما يُعرف بضريبة التغليف البرمجي للكائنات الديناميكية. في المقابل، تفرض مصفوفات نمباي تجانساً نوعياً صارماً؛ حيث تحتوي المصفوفة حصراً على عناصر من نفس نوع البيانات المخصص مسبقاً، مما يلغي الحاجة إلى فحص الأنواع أثناء المعالجة.

تُخزن بيانات ndarray داخل كتل متصلة ومتجاورة فيزيائياً في الذاكرة (Contiguous Memory Blocks)، مما يعني أن المعالج الرياضي يستطيع الانتقال من عنصر إلى العنصر التالي بمجرد إضافة إزاحة ثابتة ومحددة إلى مؤشر الذاكرة. هذا التجانس والتقارب الفيزيائي يحقق قفزة نوعية في كفاءة المعالجة، حيث يتم تمرير البيانات مباشرة إلى وحدات الحوسبة المكتوبة بلغة C المنخفضة المستوى التي تتألف منها نواة نمباي. تستفيد هذه النواة البرمجية المدمجة من تعليمات المعالج الدقيقة ذات السجل الواحد والتعليمات المتعددة (SIMD)، مما يسمح بإجراء الحسابات على مجموعات كاملة من البيانات في دورة معالج واحدة بدلاً من معالجة كل عنصر على انفراد.

1.2 مدخل إلى عمليات التجميع الرياضي (Vectorized Aggregation)

يُمثل التوجيه الرياضي (Vectorization) النواة الفلسفية التي تقوم عليها الحوسبة عالية الأداء في بايثون. يقوم هذا المفهوم على التخلص النهائي من الحلقات التكرارية الصريحة (Explicit Loops) مثل حلقات for و while المكتوبة على مستوى بايثون عالي المستوى، والاستعاضة عنها بعمليات مجمعة تُنفذ بالكامل داخل الشيفرة المترجمة بلغة C. ففي الحلقات التكرارية الصريحة، يتحمل المفسر كلفة باهظة في كل تكرار للتحقق من الشروط وإدارة المؤشرات، بينما يؤدي استدعاء دالة جمع موجهة إلى تشغيل حلقة C سريعة ومحسنة داخلياً تتصل بالعتاد مباشرة.

تندرج عملية جمع المصفوفات تحت مظلة “تقليص الأبعاد” (Dimensionality Reduction) عبر التجميع الرياضي، حيث تُختزل مجموعة من الأرقام إلى قيمة وحيدة أو إلى مصفوفة ذات رتبة أصغر وفق الخصائص الجبرية لعملية الجمع، مثل التبديل والتجميع. يمارس هذا التجميع تأثيراً بالغ الأهمية على التخزين المؤقت في المعالج؛ فعند قراءة البيانات المتصلة بانتظام، تستفيد وحدة المعالجة المركزية من مبدأ الموضعية المكانية (Spatial Locality) للبيانات في الذاكرة المخبأة (CPU Cache Hit). هذا يعني أن البيانات تُنقل مسبقاً إلى مستويات الكاش فائقة السرعة (L1, L2, L3)، مما يقلل من زمن الوصول إلى الذاكرة الرئيسية ويجعل عملية الاختزال الحسابي شبه آنية.

1.3 هيكلية البيانات ثنائية الأبعاد ومحددات الشكل الرياضي

تتحدد هوية المصفوفة ثنائية الأبعاد في نمباي من خلال سمة الشكل (shape)، وهي عبارة عن صف مرتب (Tuple) يحمل قيمتين أساسيتين: عدد الصفوف (Rows) وعدد الأعمدة (Columns)، ويُرمز لها اصطلاحاً بـ (M, N). إن هذا التوصيف الشكلي ليس مجرد تمثيل هندسي مجرد، بل هو الواجهة التي تُترجم كيف يتم تفسير الكتلة الأحادية للذاكرة الفيزيائية كجدول بيانات ثنائي الأبعاد. يرتبط هذا الشكل الرياضي ارتباطاً وثيقاً بسمة حيوية أخرى تُعرف باسم خطوة التدرج أو “الخطوات” (Strides)، والتي تحدد عدد البايتات التي يجب على مؤشر الذاكرة قفزها للوصول إلى العنصر التالي في أي اتجاه، سواء كان الانتقال أفقياً بين الأعمدة أو رأسياً بين الصفوف.

تؤثر طريقة ترتيب البيانات داخل هذه الكتلة المتصلة تأثيراً مباشراً على أداء العمليات المصفوفية. في نمط الترتيب القياسي للغة C (المعروف بـ Row-major order)، تُخزن عناصر الصف الأول متتابعة بالكامل في الذاكرة، تليها مباشرة عناصر الصف الثاني، وهكذا دواليك. في المقابل، يتبع نمط لغة فورتران (Fortran / Column-major order) نهجاً عكسياً؛ حيث تُخزن عناصر العمود الأول متتابعة، ثم عناصر العمود الثاني. تتجلى أهمية هذا التمايز عند تنفيذ عمليات الجمع؛ فالقراءة التي تسير في نفس اتجاه التخزين الفيزيائي تضمن تدفقاً خطياً للبيانات داخل الذاكرة المخبأة، بينما يؤدي المسار المعاكس لترتيب التخزين إلى حدوث إخفاقات متكررة في الذاكرة المؤقتة (Cache Misses) تبطئ من سرعة الحساب.

2. المفهوم الرياضي والبرمجي لمحاور المصفوفات (Axis Concept)

2.1 تعريف المحور البرمجي في الفضاء متعدد الأبعاد

يُعد مصطلح “المحور” (Axis) في نمباي أحد أكثر المفاهيم التي يساء فهمها برمجياً ورياضياً، نظراً لتعارضه الظاهري مع التفكير الهندسي الكلاسيكي للمحاور الديكارتية. فبينما يمثل المحور في الهندسة الديكارتية اتجاهاً ثابتاً يُقاس عليه الموضع (مثل المحور السيني الأفقي والمحور الصادي الرأسي)، يشير المحور في بيئة نمباي إلى اتجاه الانهيار أو التجميع الحسابي. بمعنى آخر، المحور البرمجي هو مؤشر إلى البُعد الذي سيتم دمج أو إلغاء وجوده عند تطبيق عملية تجميعية رياضية.

تعتمد نمباي ترقيماً قياسياً صفرياً للمحاور يبدأ من الصفر (0-indexed). في مصفوفة ذات بعدين، يُمثل المحور رقم 0 البُعد الأول للمصفوفة وهو بُعد الصفوف، بينما يُمثل المحور رقم 1 البُعد الثاني وهو بُعد الأعمدة. وعند تمرير مُعامل المحور إلى إحدى دوال التجميع، فإن القاعدة الحاكمة تنص على ما يلي: “المحور الذي يتم تحديده صراحة هو المحور الذي ستتحرك العملية عبره ليتم ضغطه وتقليص طوله إلى قيمة واحدة”. هذا المنطق الرياضي الصارم يعني أن تحديد المحور هو في الحقيقة توجيه للخوارزمية لمسح هذا البعد بالتحديد ودمجه نهائياً في الهيكل الناتج.

2.2 المحور صفر (axis=0): الانهيار عبر الصفوف

عند تمرير المعامل الحسابي axis=0 لدالة الجمع، فإن الآلية الميكانيكية للعملية تتحرك عمودياً، أي أنها تتنقل رأساً من صف إلى صف آخر عبر الصفوف المتتالية، مع تثبيت مؤشر العمود. رياضياً، إذا كان لدينا مصفوفة A ذات رتبة ثنائية وشكل (M, N)، فإن عملية الجمع عبر المحور 0 تقوم بإجراء الحساب التراكمي لجميع العناصر التي تشترك في نفس مؤشر العمود j، عبر جميع الصفوف الممكنة من i=0 إلى i=M-1. وبالتالي، تتلخص هذه العملية في الصيغة الرياضية التالية:

S[j] = ∑i=0M-1 A[i, j]

ينتج عن هذا الانهيار الرياضي تحول المصفوفة الأصلية ذات الشكل (M, N) إلى متجه أحادي البعد (أو مصفوفة مضغوطة) بطول N، وهو ما يطابق عدد الأعمدة بالضبط. هذا هو السبب المباشر الذي يجعل axis=0 يُسمى بـ “جمع الأعمدة”؛ فالجمع يتحرك عبر بُعد الصفوف ليُبقي على مجاميع منفصلة لكل عمود على حدة. تتطابق هذه النمذجة الرياضية بدقة مع مفهوم إسقاط الفضاءات المتجهية في الجبر الخطي، حيث يتم إسقاط مصفوفة التحويل على المتجه الأفقي لمجموع الأعمدة.

2.3 المحور واحد (axis=1): الانهيار عبر الأعمدة

في المقابل، تعمل الآلية الميكانيكية للجمع عند ضبط المحور على axis=1 باتجاه أفقي صرف. في هذه الحالة، يتحرك مؤشر الحوسبة عبر أعمدة المصفوفة عموداً تلو الآخر، مع الحفاظ على ثبات مؤشر الصف. ومن منظور الجبر الخطي والتحليل الرياضي، فإن تطبيق الجمع عبر المحور 1 على مصفوفة A بشكل (M, N) يعني جمع العناصر ذات مؤشر الصف الموحد i عبر جميع الأعمدة المتاحة من j=0 إلى j=N-1، وفقاً للعلاقة الرياضية:

S[i] = ∑j=0N-1 A[i, j]

تؤدي هذه المعالجة إلى اختزال تام للمحور 1، مما يحول المصفوفة من شكلها الأصلي ثنائي الأبعاد إلى متجه أحادي البعد بطول M، وهو ما يعادل عدد الصفوف الأصلية بدقة تامة. يُفسر هذا السلوك منطقياً سبب إطلاق مصطلح “جمع الصفوف” على هذا النمط؛ فالعملية تجمع كافة المتغيرات أو السمات الأفقية التابعة لكائن أو عينة معينة لإنتاج خلاصة وحيدة تمثل المجموع التراكمي لهذا الصف المستقل ضمن فضاء العينات المدروسة.

2.4 استخدام الفهارس السالبة للمحاور وتطبيقاتها

توفر بايثون ونمباي نظام فهرسة مرن يمتد ليشمل الفهارس السالبة للمحاور، وهو مفهوم مأخوذ من منطق الوصول العكسي لعناصر القوائم البرمجية. يمثل المحور ذو القيمة السالبة axis=-1 المحور الأخير في بنية المصفوفة أياً كانت رتبتها أو عدد أبعادها. في المصفوفات ثنائية الأبعاد، يتطابق المحور axis=-1 تماماً مع المحور axis=1، لأنه يمثل البُعد الأخير في تسلسل الأبعاد المكون من بعدين اثنين فقط (0 ثم 1). بالمثل، فإن المحور axis=-2 في مصفوفة ثنائية الأبعاد يشير إلى البُعد قبل الأخير، وهو ما يطابق المحور axis=0.

تتجلى الفائدة القصوى لاستخدام الفهارس السالبة عند كتابة شيفرات برمجية وخوارزميات عامة الأغراض (Generalized Algorithms) تتعامل مع مصفوفات ذات أبعاد غير محددة مسبقاً، مثل خوارزميات معالجة الصور الرقمية أو طبقات شبكات التعلم العميق، حيث قد تكون البيانات ثلاثية أو رباعية الأبعاد. إن استخدام axis=-1 يضمن دائماً إجراء عملية الجمع عبر البعد الأخير (مثل قنوات الألوان أو السمات اللحظية) دون الحاجة لفحص طول شكل المصفوفة ديناميكياً. ومع ذلك، يجب توخي الحذر الشديد في المشاريع البرمجية المعقدة لعدم الخلط بين الفهرسة الموجبة والسالبة لضمان مقروئية الشيفرة وسهولة تتبعها وصيانتها من قبل فرق العمل.

3. آلية جمع الصفوف في مصفوفة ثنائية الأبعاد باستخدام axis=1

3.1 التحليل الإجرائي لدالة arr.sum(axis=1)

عند تنفيذ التابع الموجه arr.sum(axis=1) على كائن مصفوفة ثنائية الأبعاد، تبدأ بيئة تشغيل نمباي سلسلة من الخطوات الإجرائية الدقيقة التي تديرها مكتبات C الكامنة. أولاً، تقوم النواة بفحص صحة الاستدعاء والتحقق من أن المحور المطلوب يقع ضمن النطاق المسموح به لأبعاد المصفوفة المعطاة، وهو [2, 2-]. بعد التأكد من صحة الفهارس، يتم استدعاء مكرر التكرار الداخلي المتجهي الذي يقوم بجدولة عملية الجمع الحسابي على مستوى الذاكرة الفيزيائية.

يقوم المكرر بتثبيت مؤشر الصف عند المؤشر الصفري، ثم يقرأ عناصر الأعمدة المتتابعة في هذا الصف بالاعتماد على خطوة التدرج للأعمدة (strides[1]). تُجمع هذه القيم تراكمياً في مسجل حسابي عالي السرعة حتى الوصول إلى نهاية الصف. بمجرد الانتهاء، تُكتب القيمة الناتجة في مصفوفة الخرج المخصصة، ويقفز مؤشر الذاكرة بمقدار خطوة الصف (strides[0]) للانتقال إلى بداية الصف التالي، وتتكرر العملية لكل صف بشكل مستقل. ينتج عن هذه المعالجة متجه أحادي البعد بنمط البيانات نفسه أو بنمط تمت ترقيته، يحمل دلالة إحصائية مباشرة تمثل المحصلة الإجمالية لكل كائن أو مراقبة داخل النموذج.

3.2 دراسة حالة تفصيلية لجمع الصفوف الرياضية

لفهم هذا المسار بشكل ملموس، لنفترض وجود مصفوفة بيانات قياسية بحجم ستة صفوف وثلاثة أعمدة (6×3)، تمثل قياسات حيوية لستة مرضى مختلفين عبر ثلاثة مؤشرات صحية مختلفة. لتكن المصفوفة ممثلة بالأعداد التالية:

الصف الأول: [10، 20، 30]
الصف الثاني: [15، 25، 35]
الصف الثالث: [12، 22، 32]
الصف الرابع: [18، 28، 38]
الصف الخامس: [14، 24، 34]
الصف السادس: [16، 26، 36]

عند تطبيق الدالة arr.sum(axis=1) على هذه المصفوفة، يبدأ التتبع الحسابي للصف الأول بجمع: 10 + 20 + 30 = 60. وللصف الثاني: 15 + 25 + 35 = 75. وللصف الثالث: 12 + 22 + 32 = 66. وللصف الرابع: 18 + 28 + 38 = 84. وللصف الخامس: 14 + 24 + 34 = 72. وأخيراً للصف السادس: 16 + 26 + 36 = 78. النتيجة البرمجية التي تُرجعها نمباي هي مصفوفة أحادية البعد ذات الشكل (6,) وتحتوي على القيم المتتالية: [60، 75، 66، 84، 72، 78]. يتطابق هذا المخرج البرمجي تطابقاً مطلقاً مع التوقعات النظرية للجبر الخطي، حيث اختُزل البُعد الأفقي للمتغيرات إلى قياس مجمع لكل صف مفرد.

3.3 تطبيقات تحليل البيانات المستخلصة من جمع الصفوف

يحظى جمع الصفوف بأهمية محورية وتطبيقية هائلة في علوم البيانات وهندسة الميزات (Feature Engineering). يُستخدم هذا الإجراء بكثافة عند حساب المجموع التراكمي لدرجات الطلاب في اختبارات متعددة المواد، أو تجميع درجات الإجابة على فقرات مقياس نفسي معين لتوليد الدرجة الكلية للمفحوص، أو جمع استهلاك الطاقة عبر غرف مختلفة لمنزل واحد لإنتاج استهلاك المنزل الإجمالي خلال فترة زمنية محددة.

علاوة على ذلك، يشكل جمع الصفوف حجر الزاوية في عمليات التطبيع والتقييس الرياضي (Data Normalization). فعند الرغبة في تحويل مصفوفة التكرارات إلى مصفوفة احتمالية مشروطة، أو عند تطبيق خوارزميات مثل دالة التوزيع الاحتمالي البعدي في التعلم الآلي، يتوجب أولاً حساب مجموع كل صف عبر axis=1، ومن ثم قسمة عناصر كل صف على مجموعه الخاص. يضمن هذا الإجراء الرياضي أن يصبح مجموع قيم كل صف مساوياً لواحد صحيح، مما يمهد الطريق لبناء نماذج تصنيف احتمالية بالغة الدقة.

4. آلية جمع الأعمدة في مصفوفة ثنائية الأبعاد باستخدام axis=0

4.1 التحليل الإجرائي لدالة arr.sum(axis=0)

تتطلب عملية الجمع العمودي باستخدام arr.sum(axis=0) مساراً تنفيذياً مختلفاً في إدارة الذاكرة. عند استدعاء هذه الدالة، فإن الخوارزمية الداخلية تسعى إلى تقليص البُعد الصفري (الصفوف)، مما يعني أن الحساب يتراكم لكل عمود بشكل مستقل عبر كافة الصفوف المتاحة. في هذه الآلية، تظل قيم الأعمدة معزولة عن بعضها البعض، حيث تتدفق البيانات عمودياً من العنصر الموجود في الصف 0 للعمود j، نزولاً إلى العنصر الموجود في الصف M-1 لنفس العمود j.

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

4.2 تطبيق عملي خطوة بخطوة للجمع العمودي

بالعودة إلى مصفوفة البيانات القياسية السابقة بحجم (6×3) التي تتضمن قيم القياسات الحيوية لستة مرضى، لنقم بتتبع الجمع الحسابي عند استخدام axis=0 بدقة متناهية. تشتمل المصفوفة على ثلاثة أعمدة تمثل المتغيرات الثلاثة المستقلة:

  • العمود الأول (المؤشر الأول): يضم القيم [10، 15، 12، 18، 14، 16]. يتم الجمع رأسياً: 10 + 15 + 12 + 18 + 14 + 16 = 85.
  • العمود الثاني (المؤشر الثاني): يضم القيم [20، 25، 22، 28، 24، 26]. يتم الجمع رأسياً: 20 + 25 + 22 + 28 + 24 + 26 = 145.
  • العمود الثالث (المؤشر الثالث): يضم القيم [30، 35، 32، 38، 34، 36]. يتم الجمع رأسياً: 30 + 35 + 32 + 38 + 34 + 36 = 205.

المخرج النهائي الناتج عن تنفيذ الشيفرة هو متجه أحادي البعد ذو الشكل (3,) وتكون عناصره الحسابية الدقيقة هي: [85، 145، 205]. نلاحظ هنا بوضوح كيف انهارت الصفوف الستة بالكامل واختُزلت في قيمة واحدة لكل متغير، مما ترك لنا مصفوفة مساوية تماماً لعدد الأعمدة الأصلية، وهو ما يجسد التعريف الهندسي والبرمجي لانهيار المحور صفر.

4.3 الأهمية الإحصائية لجمع الأعمدة في البحوث الكمية

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

يشكل جمع الأعمدة النواة الأولى لحساب المتوسط الحسابي الإجمالي للمتغير، وحساب التباين والانحراف المعياري، واختبار فرضيات التوازن الإحصائي. فمن خلال جمع الأعمدة، يمكن للباحث رصد ما إذا كان هناك انحياز أو تركيز رقمي مفرط في متغير دون غيره، أو التحقق من توازن العينات التجريبية. كما تُستخدم هذه المجاميع العمودية كخطوة تأسيسية في خوارزميات التحليل العاملي وتحليل المكونات الرئيسية (PCA) لمركزة البيانات (Centering) حول الصفر من خلال طرح المتوسط العمودي المحسوب من كل عمود أصلي.

5. المقارنة المنهجية بين تابع الكائن arr.sum ودالة المكتبة np.sum

5.1 الفروق المعمارية في نمط الاستدعاء

توفر نمباي طريقتين متطابقتين وظيفياً للوهلة الأولى لحساب مجموع المصفوفات: الأولى عبر استدعاء التابع المرتبط بالكائن arr.sum()، والثانية عبر استدعاء دالة الوحدة العامة numpy.sum(arr). ورغم أن النتيجة الحسابية النهائية متطابقة في كلا الأسلوبين، إلا أن هناك فروقاً معمارية جوهرية بينهما على مستوى التنفيذ الداخلي.

يُمثل arr.sum() تابعاً صريحاً (Method) مُعرفاً داخل الفئة C الأساسية لكائن ndarray. عند استدعائه، تُمرر المصفوفة لنواة التنفيذ مباشرة دون وساطة. في المقابل، فإن دالة المكتبة np.sum() هي دالة عامة (Wrapper Function) تقبل أي كائن بايثون قابل للتكرار (مثل القوائم العادية أو الصفوف)، وتقوم أولاً بخطوة وسيطة تفحص فيها ما إذا كان المدخل عبارة عن مصفوفة نمباي أصيلة؛ فإذا لم يكن كذلك، تقوم الدالة بتحويله ضمنياً إلى مصفوفة باستخدام np.asanyarray() قبل تمريره إلى خوارزمية التجميع الأساسية. يترتب على هذا الفحص تكلفة معالجة إضافية طفيفة.

5.2 تحليل الأداء والسرعة الحسابية للمنهجين

عند قياس زمن التنفيذ الميكروي باستخدام أدوات التحليل الزمني الدقيقة مثل وحدة timeit القياسية في بايثون، يظهر تفوق طفيف ومستمر لصالح تابع الكائن arr.sum(). يرجع هذا الفارق الزمني إلى ما يُعرف بـ “الحمل الإضافي للاستدعاء” (Function Call Overhead). ففي سيناريوهات الحوسبة فائقة السرعة التي تتطلب استدعاء عملية الجمع مئات الآلاف من المرات في الثانية داخل حلقات معقدة، يؤدي الاستدعاء المباشر لتابع الكائن إلى تفادي طبقات التحقق من النوع والتحويل الضمني التي تجريها دالة الوحدة.

توضح التجارب الحسابية أن الفارق في الأداء لا يتعدى عدة نانو ثوانٍ لكل عملية استدعاء، وهو ما قد يبدو ضئيلاً في العمليات البسيطة المعزولة. ومع ذلك، في مشاريع المحاكاة واسعة النطاق وخوارزميات الرؤية الحاسوبية ومعالجة الإشارات، فإن هذا التراكم الزمني يمكن أن يُحدث فارقاً ملموساً في زمن التشغيل الكلي. لذلك، تستقر التوصيات البرمجية المتقدمة على اعتماد تابع الكائن arr.sum() عندما يكون المطور متأكداً تماماً من أن المتغير هو كائن ndarray مسبقاً، واقتصار استخدام np.sum() على الحالات التي قد تحتوي فيها المدخلات على بنيات بيانات متنوعة تتطلب تحويلاً ضمنياً مرناً.

5.3 معايير قابلية القراءة والاتساق البرمجي

إلى جانب اعتبارات الأداء والسرعة، تخضع كتابة الشيفرات البرمجية لمعايير جمالية وهندسية صارمة تتعلق بقابلية الصيانة والاتساق مع نمط بايثون القياسي (Pythonic Style). يُفضل العديد من مهندسي البرمجيات استخدام تابع الكائن arr.sum(axis=…) نظراً لتوافقه الممتاز مع نمط البرمجة الموجهة للكائنات وتسلسل الدوال (Method Chaining)، مما يسمح بكتابة تعبيرات برمجية موجزة وأنيقة مثل:

result = arr.clip(0, 100).sum(axis=1).round(2)

من جهة أخرى، يرى فريق من علماء البيانات أن استدعاء np.sum(arr, axis=…) يضفي وضوحاً دلالياً أكبر في نصوص الحوسبة الرياضية البحتة، حيث تتشابه الشيفرة في مظهرها مع التدوين الرياضي الوظيفي f(x) الشائع في الأبحاث والمنشورات العلمية. كما أن دالة الوحدة تتميز بقدرتها على التعامل مع كائنات من مكتبات رديفة تتبنى واجهة نمباي، مما يعزز التوافقية الشاملة. في نهاية المطاف، يجب على فرق العمل اعتماد معيار موحد في دليل الأسلوب المتبع في المشروع وتطبيقه باتساق تام.

6. الحفاظ على الأبعاد الهيكلية باستخدام المعامل keepdims

6.1 أهمية الحفاظ على رتبة المصفوفة (Array Rank Preservation)

بشكل افتراضي، تقوم عمليات التجميع في نمباي بتقليص رتبة المصفوفة الناتجة (Dimensionality Squeeze)؛ فإذا طُبقت دالة الجمع على مصفوفة ثنائية الأبعاد ذات الرتبة 2 (2D Array)، فإن المخرج الافتراضي يسقط هذا البعد ليتحول إلى متجه أحادي البعد ذي الرتبة 1 (1D Vector). وعلى الرغم من أن هذا السلوك يبدو منطقياً لحفظ الذاكرة، إلا أنه يمثل مصدراً رئيسياً للأخطاء البرمجية الصامتة والمعقدة عند محاولة استخدام المصفوفة الناتجة في عمليات حسابية لاحقة مع المصفوفة الأصلية.

تتجلى خطورة هذا التقليص عند محاولة تطبيق قواعد “البث الرياضي” (Broadcasting). فالمتجه أحادي البعد ذو الشكل (N,) لا يمتلك مفهوماً صريحاً للصفوف أو الأعمدة، بل هو مجرد تسلسل خطي من العناصر. وعند محاولة إجراء عمليات مصفوفية مثل طرح هذا المتجه من مصفوفة ثنائية الأبعاد، قد تخفق قواعد البث أو تُنفذ بطريقة غير مقصودة تماماً تؤدي إلى تشويه الحسابات الرياضية. هنا يبرز دور الحفاظ على الأبعاد الهيكلية كضمانة رياضية لاستقرار العمليات المتجهية.

6.2 التطبيق العملي للمعامل keepdims=True

يوفر المعامل الاختياري keepdims=True حلاً هندسياً حاسماً لهذه المشكلة. فعند تفعيل هذا المعامل، تجبر نمباي دالة الجمع على الإبقاء على نفس عدد أبعاد المصفوفة الأصلية (نفس الرتبة)، مع استبدال طول المحور الذي تم اختزاله بالقيمة 1، بدلاً من حذفه نهائياً من وصف الشكل (shape). هذا التغيير الطفيف في الهيكلية يُحدث فارقاً جذرياً في التوافق الرياضي.

لتوضيح ذلك، لنفترض وجود مصفوفة A ذات شكل (M, N):

  • عند تنفيذ arr.sum(axis=0, keepdims=True)، يتم انهيار الصفوف ولكن مع الحفاظ على الرتبة، فيكون شكل المصفوفة الناتجة هو (1, N) بدلاً من (N,). هذا المخرج يمثل مصفوفة ثنائية الأبعاد تتكون من صف واحد وعدة أعمدة.
  • عند تنفيذ arr.sum(axis=1, keepdims=True)، يتم انهيار الأعمدة مع الحفاظ على الرتبة، فيكون شكل المصفوفة الناتجة هو (M, 1) بدلاً من (M,). هذا المخرج يمثل مصفوفة ثنائية الأبعاد تتكون من عدة صفوف وعمود واحد (متجه عمودي).

6.3 حالات الاستخدام المتقدمة المرتبطة بالبث الحسابي

تكمن الفائدة الحقيقية للمعامل keepdims=True في تسهيل العمليات الرياضية المشتركة مع المصفوفة الأصلية دون الحاجة لإجراء عمليات إعادة تشكيل صريحة ومعقدة. من أشهر هذه الحالات، حساب النسب المئوية أو الاحتمالات لكل صف عبر قسمة كل عنصر على مجموع صفه الخاص. فإذا كانت المصفوفة A ذات شكل (M, N)، فإن الجمع الافتراضي يعطي شكلاً (M,)، والقسمة المباشرة A / A.sum(axis=1) ستفشل مسببة خطأ في البث الرياضي، لأن قواعد البث تحاذي الأبعاد بدءاً من اليمين، فتفترض أن الطول M يتطابق مع الأعمدة N.

في المقابل، عند استخدام keepdims=True، يصبح شكل مصفوفة المجاميع (M, 1). وعند تطبيق القسمة A / A.sum(axis=1, keepdims=True)، تتطابق الأبعاد بسلاسة مطلقة: حيث يُبث البُعد ذو الطول 1 تلقائياً ليتطابق مع عدد أعمدة المصفوفة الأصلية N، وتتم القسمة عنصراً بعنصر لكل صف بمفرده وبكفاءة معمارية خارقة، متجنبة استخدام دوال التشكيل الإضافية مثل np.reshape() أو إضافة محاور وهمية باستخدام np.newaxis.

7. معالجة القيم المفقودة وغير المعرفة (NaN) أثناء حساب المجموع

7.1 سلوك دالة الجمع القياسية مع القيم غير المعرفة

في التطبيقات الواقعية لعلوم البيانات، نادراً ما تكون مجموعات البيانات نقية وخالية من الأخطاء؛ إذ تحتوي غالباً على قيم مفقودة أو غير معرفة، والتي يرمز لها في نمباي بالرمز np.nan (Not a Number) وفقاً لمعيار الحوسبة العشرية الدقيقة IEEE-754. تتميز قيمة NaN بخاصية حسابية تُعرف بخاصية “الانتشار التسممي” (Poisonous Propagation)، حيث يؤدي دخول هذه القيمة في أي عملية حسابية تقليدية إلى تحويل الناتج بالكامل إلى NaN فوراً.

ينطبق هذا السلوك الصارم على دالة الجمع القياسية arr.sum(). فإذا كانت المصفوفة تحتوي على مليون رقم صحيح، وتخللتها قيمة مفقودة واحدة فقط (np.nan)، فإن محاولة جمع عناصر هذا الصف أو ذلك العمود ستنتهي بحتمية رياضية واحدة: ستكون النتيجة np.nan. يتسبب هذا السلوك في إفساد التحليلات الإحصائية وتوقف خطوط أنابيب التعلم الآلي، مما يفرض ضرورة توفير آليات بديلة للتعامل مع البيانات غير المكتملة دون التوقف عن المعالجة.

7.2 استخدام دالة np.nansum للتعامل الآمن مع البيانات غير المكتملة

لمواجهة هذه المشكلة، طورت مكتبة نمباي دالة مخصصة فائقة الأمان هي numpy.nansum(). تتعامل هذه الدالة مع القيم غير المعرفة np.nan بمنطق رياضي مختلف تماماً؛ حيث تعامل كل قيمة NaN وكأنها العنصر المحايد الجمعي (الصفر الرياضي)، متجاهلة وجودها الحسابي أثناء عملية التجميع التراكمي، مما يسمح بحساب المجموع الفعلي للقيم العددية الصالحة المتبقية.

تدعم دالة np.nansum() كافة المعاملات البرمجية المتقدمة للدالة الأصلية، بما في ذلك التحكم في المحاور (axis=0 لجمع الأعمدة، و axis=1 لجمع الصفوف) واستخدام keepdims=True. فإذا طبقنا الدالة على صف يحتوي على القيم [10, np.nan, 20] باستخدام axis=1، فإن الناتج سيكون 30.0 تماماً، بدلاً من الفشل وإرجاع nan. تجدر الإشارة إلى أنه في حال كان الصف أو العمود بأكمله مؤلفاً من قيم nan حصراً، فإن الدالة سترجع صفراً رياضياً (0.0)، وهو السلوك القياسي المعتمد لمجموع المجموعات الفارغة في الجبر المجرد.

7.3 المحاذير الإحصائية لتجاهل القيم المفقودة

على الرغم من القوة البرمجية والراحة التي توفرها دالة np.nansum()، إلا أن استخدامها الأعمى ينطوي على مخاطر إحصائية ومنهجية بالغة الخطورة يجب على الباحثين وعلماء البيانات التنبه لها. إن تجاهل القيم المفقودة واعتبارها مساوية للصفر رياضياً يُعد افتراضاً ضمنياً بأن غياب القيمة يماثل انعدام الأثر، وهو أمر نادراً ما يصح في الدراسات العلمية الرصينة.

يؤدي هذا التجاهل إلى تقليص الحجم الفعلي للعينة (Effective Sample Size) بشكل متباين بين المتغيرات دون توثيق رياضي صريح، مما ينجم عنه تشويه خطير في المقاييس الإحصائية اللاحقة كالمتوسطات والانحرافات. فالمجموع الصادر عن np.nansum() لا يمثل المجموع الحقيقي للمجتمع عند وجود قيم مفقودة، بل يمثل مجموع العينات الفرعية المتوفرة فقط. ولذلك، تنص المعايير الإحصائية على ضرورة اللجوء إلى استراتيجيات التضمين الرياضي المسبق (Imputation Strategies) — مثل التعويض بمتوسط المتغير، أو التضمين عبر الانحدار الخطي أو خوارزميات الجار الأقرب — قبل إجراء التجميع الجمعي، لضمان موثوقية النتائج النهائية.

8. إدارة أنواع البيانات وتفادي طفحان الذاكرة الحسابي (Data Types & Overflow)

8.1 محددات أنواع البيانات الرقمية في نمباي

تلتزم نمباي بالبنية التخزينية الصارمة للأعداد الرقمية كما تُعرفها لغة C ومعالجات الحواسيب. وبخلاف بايثون القياسية التي توفر أعداداً صحيحة ذات دقة غير محدودة (Arbitrary Precision Integers) قادرة على النمو التلقائي لاستيعاب أي رقم مهول، تستخدم نمباي أنواع بيانات ذات أحجام بتية ثابتة في الذاكرة لضمان الأداء الفائق، مثل الأعداد الصحيحة محدودة السعة: np.int8 (الذي يتراوح بين -128 و 127)، و np.int16، و np.int32، وصولاً إلى np.int64.

تنبع الخطورة الحسابية الكبرى من ظاهرة “الطفحان الحسابي” (Integer Overflow). تحدث هذه الظاهرة عندما يتجاوز المجموع التراكمي لعناصر المصفوفة السعة القصوى المسموحة لنوع البيانات المعتمد. في هذه الحالة، لا تُصدر نمباي خطأ استثنائياً يوقف البرنامج، بل تقوم بالدوران الرياضي الصامت (Modulo Wrap-around)؛ حيث يلتف الرقم الموجب الضخم فجأة ليصبح رقماً سالباً في أقصى النطاق المعاكس. يؤدي هذا السلوك إلى تدمير سلامة البيانات والنتائج الحسابية دون أن يدرك المطور وقوع الكارثة.

8.2 التحكم في نوع مخرجات الجمع عبر معامل dtype

لتفادي مخاطر الطفحان الحسابي، توفر نمباي المعامل الحيوي dtype ضمن دوال الجمع، والذي يسمح بتحديد نوع البيانات المطلوب تخزين النتيجة الحسابية فيه وتحديد نوع المسجل الداخلي المعتمد للتراكم أثناء الحساب. فإذا كانت لدينا مصفوفة ضخمة من نوع np.int16، فإن جمع عناصرها عبر الصفوف أو الأعمدة قد يتجاوز بسهولة القيمة 32,767، مما يسبب طفحاناً محققاً.

يمكن معالجة هذه المعضلة بدقة متناهية عبر تمرير نوع بيانات أعلى صراحة، مثل arr.sum(axis=0, dtype=np.int64) أو حتى استخدام الأعداد العشرية ذات الدقة المضاعفة dtype=np.float64. عند تحديد هذا المعامل، تقوم نمباي بترقية النوع الحسابي (Type Casting) داخلياً قبل بدء عملية التجميع التراكمي، مما يضمن استخدام مسجلات حسابية عريضة النطاق تستوعب المجاميع الفلكية بأمان تام ودون أي تشويه رقمي، محققة الجمع الدقيق المطلوب للتحليلات الكبيرة.

8.3 التحكم في موقع تخزين النتائج باستخدام معامل out

في بيئات الحوسبة عالية الأداء والتطبيقات الصناعية المقيدة بموارد ذاكرة محدودة (مثل الأنظمة المدمجة ومعالجة التدفقات البيانية الضخمة)، تُعد عملية تخصيص وحذف الكائنات من الذاكرة العشوائية (Memory Allocation/Deallocation) عملية مكلفة جداً تتسبب في استهلاك غير مبرر لوحدة المعالجة وتجزئة الذاكرة. توفر نمباي ميزة هندسية بالغة التطور لمعالجة هذا الهدر عبر المعامل out.

يتيح المعامل out للمبرمج تمرير مصفوفة تخزين فارغة محجوزة مسبقاً (Pre-allocated Array) ليتم كتابة نتائج الجمع الموجه بداخلها مباشرة، بدلاً من قيام نمباي بإنشاء كائن مصفوفة جديد وإرجاعه في كل مرة. يُشترط فقط أن تكون مصفوفة الخرج الممررة مطابقة تماماً في الشكل ونوع البيانات للأبعاد المستهدفة بعد الجمع. إن استخدام out يلغي تماماً الحاجة لتدخل جامع النفايات البرمجي (Garbage Collector)، مما يرفع استقرار وموثوقية الشيفرة وسرعتها في الحلقات الزمنية المستمرة.

9. تطبيقات الجمع في المصفوفات ثلاثية ومتعددة الأبعاد

9.1 بنية المصفوفات ثلاثية الأبعاد والمحاور التراكمية

لا تقتصر معالجة البيانات الحديثة على الجداول ثنائية الأبعاد، بل تمتد لتشمل الموترات (Tensors) والمصفوفات ثلاثية ومتعددة الأبعاد. في المصفوفات ثلاثية الأبعاد (3D Arrays)، يتم تمثيل الشكل الرياضي عبر ثلاثة محاور أساسية: العمق أو الطبقات (Depth / Slices)، والصفوف (Rows)، والأعمدة (Columns)، وتأخذ المصفوفة شكلاً ثلاثياً مثل (D, M, N).

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

  • الجمع عبر المحور 0 (axis=0): يعني التحرك عمودياً عبر الطبقات أو الشرائح المتتالية، مما يؤدي إلى دمج الطبقات D معاً، وتكون النتيجة مصفوفة ثنائية الأبعاد بشكل (M, N) تمثل مجموع المصفوفات المكونة للعمق.
  • الجمع عبر المحور 1 (axis=1): يعني التحرك رأسياً عبر الصفوف داخل كل طبقة بمفردها، منتجاً مصفوفة ثنائية الأبعاد بشكل (D, N).
  • الجمع عبر المحور 2 (axis=2): يعني التحرك أفقياً عبر الأعمدة لكل صف داخل كل طبقة، وتكون النتيجة مصفوفة ثنائية الأبعاد بشكل (D, M).

9.2 التجميع عبر محاور متعددة في وقت واحد (Tuple of Axes)

تتيح مكتبة نمباي إمكانية متقدمة للغاية تتجاوز الجمع عبر محور فردي، وذلك من خلال تمرير صف مرتب من المحاور (Tuple of Axes) إلى المعامل axis، مثل axis=(0, 1) أو axis=(1, 2). تتيح هذه الميزة إجراء تسطيح جزئي واختزال متزامن لأكثر من بُعد في خطوة حسابية واحدة دون الحاجة لتكرار العمليات البرمجية المتتالية.

فعلى سبيل المثال، إذا كانت لدينا مصفوفة ثلاثية الأبعاد بشكل (D, M, N) وطبقنا عليها الدالة arr.sum(axis=(1, 2))، فإن الخوارزمية ستقوم بجمع كافة الصفوف وكافة الأعمدة في آن واحد لكل شريحة عمق D، مما يؤدي إلى انهيار البعدين معاً والاحتفاظ بالبعد الصفري فقط، ليكون الناتج متجهاً أحادي البعد بطول D. يمثل هذا التجميع الهندسي إسقاطاً متزامناً لمساحة السطح الثنائي داخل الفضاء ثلاثي الأبعاد، وهو ما يوفر أداءً استثنائياً يتفوق بمراحل على تنفيذ عمليتي جمع منفصلتين متتاليتين.

9.3 إعادة التشكيل والتجميع المعقد في مجموعات البيانات الكبيرة

تتضح القوة الحقيقية لجمع المحاور المتعددة في مجالات معالجة الصور الرقمية والإشارات الطبية. فالصورة الملونة الرقمية تُخزن عادة كمصفوفة ثلاثية الأبعاد بشكل (Height, Width, Channels)، حيث تمثل الأبعاد: الارتفاع، العرض، وقنوات الألوان الثلاث (الأحمر، الأخضر، الأزرق). فعند الرغبة في تحويل الصورة إلى تدرجات الرمادي عبر التجميع الكلي للشدة الضوئية، أو عند حساب متوسط الطاقة اللونية لكل بكسل، يمكن ببساطة جمع المحور الأخير arr.sum(axis=2).

وفي مجال معالجة الإشارات والقياسات الحيوية (مثل تخطيط أمواج الدماغ EEG أو السلاسل الزمنية المالية)، تُخزن البيانات غالباً في مصفوفات تمثل (الأفراد، القنوات الكهربائية، النبضات الزمنية). يتيح التجميع الموجه عبر محاور محددة استخلاص الطاقة الإجمالية المنبعثة لكل قطب كهربائي عبر الزمن، أو دمج القنوات المتعددة لإنتاج مؤشر تكاملي عام للفرد، مع التأكد البرمجي المستمر من مطابقة الأبعاد الناتجة للمتطلبات الرياضية الدقيقة للنماذج الإحصائية اللاحقة.

10. الكفاءة الحاسوبية وإدارة الذاكرة في العمليات المصفوفية واسعة النطاق

10.1 أثر تخطيط الذاكرة (C-Order vs Fortran-Order) على سرعة الجمع

يرتبط الأداء الحسابي الفعلي لعمليات الجمع في نمباي ارتباطاً وثيقاً بالتخطيط الفيزيائي للبيانات داخل الذاكرة العشوائية. فالمصفوفات التي تتبع نمط لغة C (المعروفة بـ C-contiguous) تُخزن بياناتها أفقياً؛ أي أن عناصر الصف الواحد متجاورة بامتياز. ولذلك، عندما نطلب من نمباي تنفيذ arr.sum(axis=1) (جمع الصفوف)، فإن المعالج يقرأ البيانات في خط مستقيم ومتصل، مما يحقق أقصى كفاءة لذاكرة التخزين المؤقت (Cache Hits) وسرعة استثنائية.

على النقيض من ذلك، إذا تم تطبيق نفس العملية arr.sum(axis=1) على مصفوفة تتبع نمط لغة فورتران (F-contiguous) المخزنة عمودياً، فإن قراءة الصف الواحد تفرض على المعالج القفز في الذاكرة بمسافات تفصل بينها أعمدة كاملة، مما يتسبب في إخفاق متكرر للذاكرة المخبأة (Cache Misses) ويؤدي إلى تباطؤ ملحوظ في الأداء. ينعكس هذا الأمر تماماً عند جمع الأعمدة (axis=0)؛ حيث تصبح مصفوفات نمط فورتران أسرع بكثير لأن أعمدتها متصلة فيزيائياً. يمكن للمطورين المحترفين فحص وإصلاح هذا التخطيط برمجياً باستخدام الدوال np.ascontiguousarray() أو np.asfortranarray() لتحقيق أعلى معدل نقل للبيانات وفق المحور الأكثر تكراراً في الجمع.

10.2 التوازي البرمجي واستغلال المعالجات متعددة الأنوية

لا تعمل نمباي بمعزل عن مكتبات الجبر الخطي الأساسية منخفضة المستوى؛ بل ترتكز في بنيتها التحتية على مكتبات حوسبة عتادية متقدمة مثل OpenBLAS، و Intel MKL (Math Kernel Library)، و LAPACK. تتيح هذه المكتبات لمكتبة نمباي استغلال كامل القوة الحسابية للمعالجات متعددة الأنوية (Multi-core CPUs) من خلال توزيع مهام الجمع المصفوفي على خيوط معالجة متوازية (Multithreading).

عند تنفيذ عمليات الجمع على مصفوفات عملاقة تحتوي على عشرات الملايين من العناصر، تُقسم المصفوفة تلقائياً إلى كتل حسابية مستقلة تُعالج في وقت متزامن عبر أنوية المعالج المختلفة. ومع ذلك، يخضع هذا التسريع لحدود حتمية يفرضها قانون أمدال (Amdahl’s Law) وظاهرة “عنق زجاجة الذاكرة” (Memory Bandwidth Bottleneck). فعندما تصبح المصفوفة ضخمة جداً، يصبح عنق الزجاجة متمثلاً في سرعة نقل البيانات من الذاكرة الرئيسية (RAM) إلى المعالج، وليس في سرعة العمليات الحسابية ذاتها، وهو ما يجب مراعاته عند تصميم الأنظمة المتوازية.

10.3 تقنيات الجمع التدريجي للمصفوفات الضخمة المقروءة من القرص

في عصر البيانات الضخمة، كثيراً ما يواجه المطورون مصفوفات تتجاوز سعتها الإجمالية الحجم الكلي للذاكرة العشوائية المتاحة للجهاز. في مثل هذه الحالات، يفشل التحميل المباشر للبيانات ويتوقف النظام بسبب خطأ الذاكرة الشهير MemoryError. توفر نمباي حلاً برمجياً متقدماً لهذه المعضلة عبر كائنات الذاكرة المعكوسة على القرص والمعروفة باسم numpy.memmap.

تسمح تقنية memmap بقراءة المصفوفات وتعديلها كملفات ثنائية مخزنة على القرص الصلب مباشرة، مع التعامل معها برمجياً وكأنها مصفوفات ndarray عادية مقيمة في الذاكرة. ولتنفيذ جمع الصفوف أو الأعمدة بكفاءة على هذه المصفوفات الهائلة، يُطبق المطورون تقنية “التجميع بالكتل المجزأة” (Chunking)؛ حيث يتم تقسيم مصفوفة memmap إلى شرائح وكتل متتالية تُقرأ شريحة تلو الأخرى وتُجمع تدريجياً داخل مصفوفة تراكمية صغيرة، مما يتيح معالجة مجموعات بيانات بحجم مئات الغيغابايتات باستهلاك ضئيل وثابت للذاكرة العشوائية لا يتعدى عدة ميغابايتات.

11. الأخطاء الشائعة واستراتيجيات تصحيحها عند جمع المصفوفات

11.1 الخلط الدلالي بين المحور الصفر والمحور الواحد

يُعد الخلط بين axis=0 و axis=1 الخطأ المفاهيمي الأكثر شيوعاً على الإطلاق بين مستخدمي مكتبة نمباي في شتى مستوياتهم. ينبع هذا الخطأ من التناقض البصري بين طريقة تخيل الجدول وطريقة عمل الخوارزمية؛ فالمطور الذي يرغب في “جمع كل صف” يميل تفكيره تلقائياً لاختيار axis=0 ظناً منه أن الصفر يشير إلى الصفوف، فيتفاجأ بأن النتيجة جاءت بمجاميع الأعمدة، والعكس بالعكس.

لبناء حدس ذهني راسخ يمنع هذا الالتباس نهائياً، يجب ترسيخ القاعدة الذهبية التالية: “المحور المحدد في المعامل هو المحور الذي سيموت ويختفي من الشكل النهائي”. فعند اختيار axis=0، فإنك تأمر باختفاء بعد الصفوف، مما يعني حتماً بقاء مجاميع الأعمدة؛ وعند اختيار axis=1، فإنك تأمر باختفاء بعد الأعمدة، مما يعني بقاء مجاميع الصفوف. ولضمان عدم تسلل هذا الخطأ إلى بيئات الإنتاج، يُنصح بشدة بإدراج اختبارات التوكيد البرمجية (Assertions) داخل الشيفرة للتحقق من أبعاد المخرجات المتوقعة فور تنفيذ العملية:

assert row_sums.shape == (expected_rows,), “خطأ فادح: أبعاد مصفوفة المجاميع غير متطابقة مع عدد الصفوف!”

11.2 أخطاء عدم تطابق الأبعاد أثناء الدمج والبث

يصطدم المطورون مراراً برسالة الخطأ الاستثنائية الشهيرة:
ValueError: operands could not be broadcast together with shapes (M,N) and (M,)
يحدث هذا التوقف الحاد للبرنامج غالباً عند محاولة استخدام مخرجات الجمع المباشر في عمليات حسابية لاحقة مع المصفوفة الأصلية، مثل محاولة طرح مجموع الصفوف من المصفوفة بهدف مركزة البيانات، أو قسمتها لحساب النسب.

يعود السبب الجذري لهذا الخطأ إلى تجاهل استخدام المعامل keepdims=True؛ فمصفوفة الجمع بدون هذا المعامل تصبح متجهاً خطياً بطول (M,)، وعندما تحاول بايثون تطبيق قواعد البث، تفشل في مواءمة البعد الأحادي مع البعد ثنائي الأبعاد من جهة الأعمدة. يكمن التصحيح الهندسي الصارم في إضافة keepdims=True دائماً عند الرغبة في التفاعل مع المصفوفة المصدرية، أو اللجوء الاضطراري لإعادة تشكيل المتجه يدوياً عبر row_sums[:, np.newaxis]. إن تبني keepdims من البداية يمنح الشيفرة حصانة رياضية ويجعل تدفق البيانات في خطوط المعالجة سلساً وخالياً من التعقيدات.

11.3 التعامل غير المتوقع مع المصفوفات أحادية البعد

من الأخطاء البرمجية الصادمة للمبتدئين أيضاً، محاولة تمرير المعامل axis=1 إلى مصفوفة ذات بُعد واحد (1D Array)، مما يسفر فوراً عن ظهور الخطأ الاستثنائي الحتمي:
numpy.exceptions.AxisError: axis 1 is out of bounds for array of dimension 1
يحدث هذا الخطأ نتيجة الخلط بين المتجه الأفقي الخالي من الأبعاد المزدوجة وبين مصفوفة ثنائية الأبعاد تتكون من صف واحد وعدة أعمدة.

فالمصفوفة المعرفة بالصيغة np.array([1, 2, 3]) تمتلك شكلاً وحيداً هو (3,) وبُعداً وحيداً هو المحور 0 فقط؛ وبالتالي لا وجود إطلاقاً للمحور 1 في بنيتها الرياضية. لتطبيق عمليات الجمع ثنائية الأبعاد على مثل هذه المتجهات، يجب أولاً ترقيتها صراحة إلى فضاء ثنائي الأبعاد باستخدام دوال مثل np.expand_dims(arr, axis=0) للحصول على مصفوفة بشكل (1, 3)، أو إعادة التشكيل المباشر عبر arr.reshape(1, -1). يضمن هذا التحويل التأسيسي استقرار الدوال المطبقة وتجنب توقف المعالجة الحسابية بشكل مفاجئ.

12. تطبيقات عملية متقدمة وتكامل مع أطر معالجة البيانات الإحصائية

12.1 حساب المتوسطات والانحرافات المعيارية الموزونة انطلاقاً من الجمع

تتجاوز عمليات جمع الصفوف والأعمدة غايتها الأولية لتشكل الوحدات التأسيسية لبناء مقاييس إحصائية مركبة بالغة التعقيد. فعلى سبيل المثال، يتطلب حساب “المتوسط الحسابي الموزون” (Weighted Average) لعينة من البيانات ضرب مصفوفة القيم في مصفوفة الأوزان الترجيحية المقابلة عنصراً بعنصر، ثم جمع النتائج عبر المحور المطلوب، وقسمة هذا الناتج على مجموع الأوزان لنفس المحور.

يتميز هذا التطبيق الحسابي اليدوي القائم على الجمع المباشرarr.sum() بدقة فائقة ومرونة برمجية تتفوق في كثير من الأحيان على الدوال الإحصائية الجاهزة، حيث يتيح للمطورين مراقبة خطوات التحويل الرياضي خطوة بخطوة وتطبيق شروط مخصصة على المعاملات. كما يُستخدم جمع مربعات الانحرافات عن المتوسط عبر الصفوف لحساب قيم التباين المخصص ومصفوفات التغاير (Covariance Matrices)، والتي تشكل الأساس الرياضي لكافة خوارزميات النمذجة الإحصائية المتقدمة والتعلم الآلي المتين.

12.2 التكامل البيني مع مكتبة بانداس (Pandas)

ترتبط مكتبة نمباي ارتباطاً عضوياً بمكتبة بانداس (Pandas)؛ إذ إن أطر البيانات الشهيرة (DataFrames) والسلاسل الإحصائية (Series) مبنية في الأصل فوق مصفوفات ndarray. توفر بانداس دوال جمع تحمل نفس المسميات df.sum(axis=0) و df.sum(axis=1)، مع فارق جوهري في الفلسفة الافتراضية؛ حيث تقوم بانداس بتجاهل القيم المفقودة NaN تلقائياً (skipna=True افتراضياً)، وتتعامل مع الفهارس النصية والعناوين.

ومع ذلك، في خطوط الأنابيب التي تتطلب سرعات حوسبة فائقة، يفرض استدعاء دوال الجمع عبر بانداس عبئاً زمنياً إضافياً لإدارة الفهارس والتحقق من التسميات. لذا، يلجأ مهندسو البيانات المحترفون إلى استخراج مصفوفة نمباي الكامنة عبر الخاصية df.values أو التابع السريع df.to_numpy()، ثم تنفيذ عملية الجمع عبر نمباي الصرفة arr.sum(axis=…) مباشرة. يحقق هذا النمط الهجين قفزات مذهلة في سرعة المعالجة تصل إلى عشرات الأضعاف، مع إمكانية إعادة ربط النتائج الحسابية بالفهارس الأصلية لبانداس عند الحاجة لإخراج التقارير النهائية.

12.3 بناء خوارزمية قياس تشابه العينات باستخدام مجاميع الصفوف

تُعد مقاييس المسافات وتشابه البيانات حجر الزاوية في خوارزميات التجميع (Clustering) والأنظمة التوصية والتصنيف الآلي. لنأخذ مقياس “المسافة الإقليدية المربعة” (Squared Euclidean Distance) بين مصفوفة عينات A ونقطة مرجعية B كمثال تطبيقي متقدم؛ تتطلب هذه العملية طرح النقطة B من كافة صفوف المصفوفة A عبر البث الحسابي، ثم تربيع الفروق، ثم جمع قيم كل صف على حدة عبر المحور الأفقي axis=1:

distances = np.sum((A – B) ** 2, axis=1)

تُختزل مصفوفة الفروق ثنائية الأبعاد في خطوة واحدة إلى متجه مسافات أحادي البعد يعبر عن المسافة الفاصلة بين كل مفردة والنقطة المرجعية. وبالمثل، يُعتمد هذا الإجراء لحساب “تشابه جيب التمام” (Cosine Similarity) في معالجة اللغات الطبيعية وتحليل الاستبيانات النفسية والاجتماعية متعددة الأبعاد، حيث يُستخدم جمع الصفوف لحساب حاصل الضرب النقطي ومقادير المتجهات المعيارية في أجزاء من الثانية، مما يؤكد المكانة المحورية لعمليات الجمع الموجه في المنظومة التطبيقية لعلم البيانات.

12.4 خلاصة إرشادية لاختيار معاملات الجمع المناسبة للمشروع

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

السيناريو التطبيقي الدالة المقترحة المحور (axis) المعاملات الإضافية الموصى بها الغاية الهندسية والرياضية
تجميع درجات أو قياسات العينات الفردية arr.sum() axis=1 keepdims=False اختزال الأعمدة للحصول على متجه تجميعي لكل صف.
حساب إجماليات المتغيرات الإحصائية arr.sum() axis=0 keepdims=False اختزال الصفوف للحصول على إجمالي كل عمود.
تطبيع البيانات وقسمة الصفوف على مجاميعها arr.sum() axis=1 keepdims=True الحفاظ على شكل (M, 1) لتمكين البث الرياضي التلقائي.
بيانات تحتوي على قراءات مفقودة أو ملغاة np.nansum() 0 أو 1 بحسب المتطلب الهيكلي معاملة NaN كأصفار حيادية لمنع إفساد ناتج الجمع.
بيانات عددية ضخمة معرضة للطفحان الحسابي arr.sum() 0 أو 1 dtype=np.int64 أو np.float64 ترقية نوع التراكم لمنع التفاف القيم الرياضية الخاطئة.
أنظمة مدمجة أو قيود صارمة على الذاكرة arr.sum() 0 أو 1 out=preallocated_arr إلغاء حجز كائنات جديدة والحد من تدخل جامع النفايات.

تتطلب كتابة الشيفرات الحوسبية المتينة اعتماد قائمة تدقيق ختامية تشمل التحقق الدائم من: محاذاة البيانات في الذاكرة (Contiguity)، وتطابق الأبعاد المتوقعة عبر اختبارات assert، واختيار النمط التخزيني الأنسب لاتجاه الحساب المتكرر. وتتجه التطورات البرمجية الحديثة اليوم نحو دمج هذه العمليات المتجهية الأساسية مع مسرعات العتاد الرسومي (GPUs) ومكتبات الحوسبة الموزعة الحديثة مثل CuPy و JAX، والتي تحافظ على نفس الواجهات الدلالية لمحاور نمباي التي استعرضناها بالتفصيل في هذا الدليل، مما يجعل إتقان هذه الأسس النظرية والتطبيقية استثماراً معرفياً مستداماً لكل باحث ومطور يسعى للتميز في عالم الحوسبة العددية.

خاتمة

لقد استعرضنا في هذا الدليل الأكاديمي الموسع كافة الجوانب النظرية والعملية المرتبطة بجمع صفوف وأعمدة المصفوفات في مكتبة نمباي، بدءاً من البنية المتجانسة لكائنات ndarray وكيفية تنظيم الذاكرة الفيزيائية وخطوات التدرج، مروراً بالتفسير الهندسي والبرمجي الدقيق للمحاور (axis=0 و axis=1)، ووصولاً إلى التقنيات المتقدمة لإدارة الأبعاد وحماية الدقة الرياضية وتفادي أخطاء الطفحان ومشاكل القيم المفقودة. إن فهم هذه المفاهيم بعمق يتجاوز مجرد حفظ صيغ الاستدعاء؛ إذ يمنح المطور والباحث القدرة على كتابة برمجيات علمية عالية الكفاءة، متفادية للأخطاء الصامتة، وقابلة للتوسع في مجالات علوم البيانات والذكاء الاصطناعي.

المراجع

  • Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., … & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357–362. https://doi.org/10.1038/s41586-020-2649-2
  • Oliphant, T. E. (2006). A guide to NumPy (Vol. 1). Trelgol Publishing.
  • van der Walt, S., Colbert, S. C., & Varoquaux, G. (2011). The NumPy array: A structure for efficient numerical computation. Computing in Science & Engineering, 13(2), 22–30. https://doi.org/10.1109/MCSE.2011.37
  • McKinney, W. (2022). Python for data analysis: Data wrangling with pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media.
  • NumPy Developers. (2024). NumPy reference documentation: numpy.sum and indexing routines. NumPy.org. https://numpy.org/doc/stable/reference/
  • IEEE Computer Society. (2019). IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019). IEEE. https://doi.org/10.1109/IEEESTD.2019.8766229

تقييم هذا المحتوى

0.0 / 5 0 تقييمات

اقتباس هذا المقال

looti, M. (2026, سبتمبر 19). كيفية جمع صفوف وأعمدة مصفوفة نمباي. عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-sum-rows-and-columns-numpy-array/
looti, Mohammed. “كيفية جمع صفوف وأعمدة مصفوفة نمباي.” عرب سايكلوجي, 19 سبتمبر 2026, https://arabpsychology.com/statistics/how-to-sum-rows-and-columns-numpy-array/.
looti, Mohammed. “كيفية جمع صفوف وأعمدة مصفوفة نمباي.” عرب سايكلوجي. سبتمبر 19, 2026. https://arabpsychology.com/statistics/how-to-sum-rows-and-columns-numpy-array/.