برمجة بايثونعلم البيانات والذكاء الاصطناعي

كيفية تقطيع مصفوفة نمباي ثنائية الأبعاد (مع أمثلة)

دليل أكاديمي متعمق يشرح آليات وتقنيات تقطيع المصفوفات ثنائية الأبعاد في مكتبة NumPy مع تطبيقات عملية وأمثلة برمجية شاملة.

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

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

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

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

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

1. المدخل النظري لمصفوفات نمباي ثنائية الأبعاد ومفهوم التقطيع

1.1 تعريف المصفوفة ثنائية الأبعاد في بيئة بايثون ونمباي

تمثل المصفوفة ثنائية الأبعاد في بيئة الحوسبة بنية بيانات شبكية منظمة في إحداثيات ثنائية المحاور تتألف من صفوف (Rows) تمثل المحور الأول، وأعمدة (Columns) تمثل المحور الثاني. في بيئة بايثون القياسية، يتم محاكاة هذا الهيكل عادة عبر القوائم المتداخلة، إلا أن هذا النموذج يعاني من عيوب هيكلية جوهرية تحول دون استخدامه في المعالجة العلمية المتقدمة؛ فالقوائم القياسية تخزن مؤشرات مبعثرة تشير إلى كائنات بايثون المستقلة في مواقع غير متجاورة داخل الذاكرة، مما يؤدي إلى تشتت الذاكرة وفقدان التوافق مع ذاكرة التخزين المؤقت للمعالج (CPU Cache Misses).

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

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

1.2 ماهية عملية التقطيع (Slicing) وأسسها الرياضية

يُعرَّف التقطيع (Slicing) في علوم الحاسوب بأنه عملية استخراج موجهة لمصفوفة فرعية (Sub-array) أو نافذة مكانية محددة من مصفوفة أصلية أكبر دون تعديل في بنية المصدر الأساسي. يستند هذا المفهوم برمجياً إلى مبدأ الفهرسة الصفرية (Zero-based Indexing)، وهو المعيار الرياضي الذي ينطلق من الصفر كمؤشر لأول عنصر في كل محور؛ الأمر الذي يجعل الفهرس يعبر هندسياً عن “المسافة الإزاحية” (Offset) من نقطة بداية الذاكرة بدلاً من الترتيب العددي المجرد للقيم.

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

تخضع هذه العملية لقاعدة رياضية صارمة تميز أطر العمل الحديثة، وهي مفهوم “المجال نصف المفتوح” (Half-open interval) المرموز له رياضياً بالصيغة [start, stop). ووفقاً لهذه القاعدة الحسابية، يتم تضمين فهرس البداية بصورة مؤكدة داخل المقطع المستخرج، في حين يتم استبعاد فهرس النهاية تماماً من نطاق النتائج؛ مما يمنح المبرمج ميزة رياضية فريدة تتمثل في أن عدد العناصر المقتطعة في ذلك البعد يساوي دائماً حاصل الطرح المباشر (stop – start)، وهو ما يسهل العمليات الذهنية ويمنع الانزلاقات البرمجية الناتجة عن أخطاء الحساب الزائد بواحد.

1.3 الأثر الحوسبي والأداء الهندسي للتقطيع

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

على العكس من ذلك، يتم تنفيذ عمليات التقطيع في نمباي عبر مؤشرات ذاكرية مباشرة مكتوبة بلغة C المحسنة، حيث يتم تحويل استعلام التقطيع إلى قفزات حسابية مباشرة في الذاكرة دون الحاجة لتكرار استدعاء دوال المعالجة الفردية. يؤدي هذا السلوك إلى توفير هائل في استهلاك دورات المعالج الدقيق (CPU Cycles)، ويتيح الاستفادة الكاملة من خطوط أنابيب التعليمات (Instruction Pipelines) وتقنيات الحوسبة الموازية للمتجهات مثل تعليمات SIMD (Single Instruction, Multiple Data) المدمجة في المعالجات الحديثة، مما يحقق تسارعاً في الأداء يصل إلى مئات الأضعاف مقارنة بالأكواد المكتوبة بالحلقات التكرارية الصريحة.

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

2. البنية الميمورية والمفاهيمية لمصفوفات 2D في NumPy

2.1 ترتيب التخزين في الذاكرة (Memory Layout)

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

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

يمارس هذا الترتيب الميموري تأثيراً بالغ الأهمية على سرعة استرجاع المقاطع المقروءة؛ حيث إن قراءة البيانات التي تقع في عناوين متجاورة في الذاكرة تستفيد استفادة عظمى من خاصية “المكانية المكانية” (Spatial Locality)، مما يجعل المعالج يقوم بتحميل خط كامل من الذاكرة المخبأة (Cache Line) دفعة واحدة. وللتحقق من طبيعة التخزين الداخلي لأي مصفوفة، توفر نمباي الخاصية البرمجية الهامة flags، والتي يمكن فحصها لمعرفة ما إذا كانت المصفوفة تخضع لترتيب لغة C أو فورتران، وما إذا كانت تشغل كتلة متصلة تتيح الاستفادة من أقصى طاقات المعالجة.

2.2 مفهوم الخطوات الحركية في الذاكرة (Strides)

يمثل مفهوم الخطوات الحركية (Strides) العصب الحسابي الأكثر ذكاءً وإبهاراً في بنية مصفوفات نمباي؛ فالخطوة الحركية هي ببساطة عدد البايتات الفعلية التي يجب على مؤشر الذاكرة القفز فوقها للانتقال من عنصر حالي إلى العنصر المجاور التالي في بعد معين. بالنسبة للمصفوفة ثنائية الأبعاد، تمتلك المصفوفة زوجاً من الخطوات (Row Stride, Column Stride) يصف الأول تكلفة القفز إلى الصف التالي، بينما يصف الثاني تكلفة القفز إلى العمود التالي ضمن نفس الصف.

على سبيل المثال، إذا كانت لدينا مصفوفة ذات نوع بيانات float64 (حيث يشغل كل رقم 8 بايتات في الذاكرة) مؤلفة من 4 صفوف و5 أعمدة وفق تخطيط لغة C المتجاور، فإن الانتقال من عمود إلى العمود الذي يليه مباشرة يتطلب التحرك بمقدار عنصر واحد فقط، وبالتالي تكون خطوة العمود مساوية لـ 8 بايتات. أما الانتقال من عنصر في صف معين إلى العنصر المقابل له في الصف التالي، فيتطلب تخطي صف كامل مكون من 5 عناصر، وتكون خطوة الصف بالتالي مساوية لحاصل ضرب عدد الأعمدة في حجم نوع البيانات (5 * 8 = 40 بايت). يُسجل هذا الثنائي في خاصية برمجية تدعى arr.strides بالصيغة (40, 8).

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

2.3 إعداد بيئة العمل وإنشاء مصفوفة النموذج الأساسي

للشروع في التطبيق العملي والمحاكاة البرمجية الدقيقة للمفاهيم السابقة، يجب أولاً تهيئة بيئة العمل البرمجية واستيراد الأدوات القياسية المعتمدة. يتم استدعاء مكتبة نمباي في بيئات بايثون عبر التسمية المستعارة القياسية والمتفق عليها عالمياً بين جموع المطورين والباحثين، وذلك عبر كتابة التعليمة المعيارية: import numpy as np. يؤسس هذا الاستيراد نقطة الولوج لكافة الدوال والخصائص الكائنية المتطورة للمكتبة.

لتوليد مصفوفة نموذجية ثنائية الأبعاد تكون بمثابة المعمل التجريبي لكافة الأمثلة اللاحقة في هذا الدليل، نعتمد على دمج دالتين أساسيتين هما: دالة التوليد التسلسلي np.arange() ودالة إعادة تشكيل البنية الهندسية reshape(). نقوم بتوليد متوالية عددية متسلسلة مكونة من 24 رقماً صحيحاً تنطلق من الصفر وتنتهي عند الرقم 23 عبر استدعاء np.arange(24)، ثم نقوم مباشرة بتطبيق الدالة reshape(6, 4) لتقسيم هذه السلسلة الخطية إلى مصفوفة ثنائية تتكون من 6 صفوف و4 أعمدة متراصة بانتظام رياضي كامل، كما يتضح في البناء البرمجي التالي:

arr = np.arange(24).reshape(6, 4)

عند فحص البنية البصرية لهذه المصفوفة المنتجة، نجد أنها تمثل شبكة متناسقة؛ حيث يتضمن الصف الأول الفهارس [0, 1, 2, 3]، والصف الثاني [4, 5, 6, 7]، وصولاً إلى الصف السادس والأخير الذي يحمل القيم [20, 21, 22, 23]. يمكننا الآن النظر إلى كل عنصر في هذه المصفوفة عبر إحداثيين رياضيين واضحين (i, j)، حيث يشير i إلى رقم الصف الممتد من 0 إلى 5، بينما يشير j إلى رقم العمود الممتد من 0 إلى 3؛ لتصبح هذه المصفوفة بمثابة الأساس الحسابي الدقيق لجميع التجارب التطبيقية اللاحقة.

3. الصيغة النحوية العامة للتقطيع ثنائي الأبعاد

3.1 تفكيك صياغة الأقواس المربعة الثنائية

تتميز لغة نمباي بصياغة صريحة وأنيقة في التعامل مع المصفوفات متعددة الأبعاد، حيث يتم تجنب الصياغات المتداخلة المرهقة لصالح صياغة موحدة تعتمد على الأقواس المربعة المفردة التي تستوعب مؤشرات الأبعاد مجتمعة ومفصولة بفاصلة لغوية تقليدية. تتخذ القاعدة النحوية القياسية للتقطيع ثنائي الأبعاد الصورة العامة التالية: arr[row_slice, col_slice]، حيث يتم تخصيص الموقع الأول قبل الفاصلة للتحكم المطلق في مسار الصفوف، بينما يخصص الموقع الثاني بعد الفاصلة للتحكم في مسار الأعمدة.

ينقسم كل محدد تقطيع (Slice Specifier) داخل هذين الموقعين إلى ثلاثة معايير تحكم رقمية تُفصل عن بعضها بنقطتين رأسيتين وفق النمط الصياغي الكامل: [start:stop:step]. يمثل المعيار الأول start نقطة الانطلاق أو المؤشر المبدئي الذي تبدأ منه عملية استقطاع البيانات، بينما يمثل المعيار الثاني stop نقطة التوقف أو الحد الأعلى للنطاق، ويحدد المعيار الثالث step المسافة التزايدية أو خطوة القفز بين العناصر المتتابعة المشمولة بالاستقطاع.

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

3.2 استخدام الرمز النقطي المفرد لتحديد المحاور الكاملة

في كثير من المهام التحليلية، تبرز الحاجة إلى التركيز على محور محدد واستخراج قطاع منه مع الحفاظ على المحور الآخر دون أي تقييد أو اقتطاع، وهنا يبرز الدور المحوري للرمز النقطي المفرد (Colon) المتمثل في النقطتين الرأسيتين : بدون إرفاق أي أرقام قبله أو بعده. يعبر هذا الرمز في فلسفة نمباي عن “الشمولية المطلقة”، ويعني توجيه المحرك البرمجي لاختيار كافة العناصر المتاحة على امتداد هذا البعد المعني من بدايته وحتى نهايته دون استثناء.

فعلى سبيل المثال، عندما نرغب في عزل كامل الصفوف مع فرض قيود استخلاصية على الأعمدة فقط، نكتب النقطتين الرأسيتين في موضع المحور الأول قبل الفاصلة، متبوعة بفاصلة ونطاق الأعمدة، كأن نكتب: arr[:, 1:3]. في هذه الحالة، يتلقى المحرك البرمجي أمراً صريحاً بالمرور على جميع صفوف المصفوفة، ولكنه في كل صف يقوم باقتطاع الأعمدة الواقعة بين الفهرس 1 والفهرس 3 حصراً. وبالمثل، إذا كتبنا النطاق في خانة الصفوف وأعقبناه بالنقطتين المنفردتين في خانة الأعمدة مثل arr[2:4, :]، فإننا بذلك نلزم النظام باختيار كافة الأعمدة للصفوف المحددة.

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

3.3 إسقاط وتعيين القيم الافتراضية للمعاملات

صُممت الصياغة البرمجية لمكتبة نمباي بذكاء اصطلاحي يتيح للمطورين إسقاط بعض معاملات التقطيع الثلاثية [start:stop:step] اعتماداً على سلوك افتراضي مدروس بعناية، مما يمنح الشفرة البرمجية رشاقة واختصاراً كبيرين. عند إسقاط أي من هذه القيم، يتولى المحرك الحسابي إسناد القيم المحددة مسبقاً وفق السياق الرياضي للبعد المستهدف.

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

ثالثاً، فيما يتعلق بمحدد الخطوة step، فإن عدم ذكره صراحة في العبارة البرمجية يعني افتراضياً أن قيمته تساوي (1)؛ أي التحرك المنتظم خطوة بخطوة دون تخطي أي عنصر وسيط. وإذا رغب المبرمج في تغيير الخطوة مع الإبقاء على البداية والنهاية الافتراضيتين، يمكنه وضع نقطتين رأسيتين متتاليتين مثل [::2]، والتي تعني ضمنياً: ابدأ من الصفر، وسر حتى النهاية، واجعل مسافة القفز عنصرين في كل حركة. إن الإلمام بهذه القواعد الافتراضية يمكن المطور من كتابة تعبيرات برمجية موجزة وقوية في آن واحد.

4. الطريقة الأولى: تقطيع الصفوف المحددة (Row Slicing)

4.1 التطبيق العملي لاختيار صفوف متتالية عبر الصيغة arr[start:stop, :]

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

sub_rows = arr[2:5, :]

عند تحليل هذه العبارة البرمجية تحليلاً دقيقاً، نجد أن محدد الصفوف 2:5 يوجه المحرك لاستهداف الصفوف ذات الفهارس 2 و 3 و 4. ووفقاً لقاعدة النطاق نصف المفتوح، فإن الصف رقم 5 يقع خارج نافذة الاستخراج ويتم استبعاده تماماً من النتيجة. أما الرمز : الواقع بعد الفاصلة، فإنه يؤكد تضمين كافة الأعمدة (0، 1، 2، 3) المرتبطة بتلك الصفوف المحددة. وبالتالي، فإن المصفوفة الفرعية الناتجة sub_rows ستتضمن القيم الرياضية التالية:

الصف الأول من المقطع (الصف الأصلي 2): [8, 9, 10, 11]
الصف الثاني من المقطع (الصف الأصلي 3): [12, 13, 14, 15]
الصف الثالث من المقطع (الصف الأصلي 4): [16, 17, 18, 19]

إذا قمنا بفحص سمات وأبعاد المصفوفة الفرعية الناتجة عبر الخاصية sub_rows.shape، سنجد أنها مطابقة تماماً للمخرجات الرياضية المتوقعة وتساوي (3, 4)؛ أي أنها تحتوي على 3 صفوف و4 أعمدة. تتجلى القيمة التطبيقية لهذه الطريقة في سيناريوهات الواقع العملي عند التعامل مع البيانات المجدولة المعتمدة على الزمن، مثل عزل قياسات وأرصاد مجسات الاستشعار المسجلة خلال فترة زمنية محددة (كالصفوف الممثلة للساعات ما بين الظهيرة والعصر) لتحليلها المستقل دون المساس ببقية السجل اليومي.

4.2 تقطيع الصفوف من البداية وحتى فهرس محدد

في العديد من مسارات العمل المعنية بالتنقيب في البيانات والتحليل الأولي، يحتاج الباحث إلى إلقاء نظرة سريعة على العينات الاستهلالية في مجموعة البيانات دون معالجة المصفوفة برمتها، وهو ما يماثل دالة head() الشهيرة في مكتبات أخرى. لتحقيق هذا الهدف في نمباي، نستخدم صياغة التقطيع البدائي الموجهة للصفوف العليا وفق النمط: arr[:stop, :]، مع إسقاط مؤشر البداية الصريح.

بتطبيق هذا التعبير على مصفوفة الاختبار من خلال العبارة: top_slice = arr[:3, :]، يقوم النظام فوراً بإسناد القيمة الافتراضية للبداية وهي الصفر، مما يوجه عملية الاستقطاع للبدء من أول صف في المصفوفة ومواصلة السير حتى التوقف الصارم عند الفهرس رقم 3 غير المشمول. ينتج عن هذا التقطيع استخراج الصفوف ذات الفهارس 0 و 1 و 2، والتي تضم الأرقام المتسلسلة من 0 إلى 11 موزعة على ثلاثة صفوف وأربعة أعمدة بكامل اتساعها، لينتج هيكل ذو أبعاد (3, 4).

من الناحية الحسابية والبرمجية، لا يوجد أي فارق في الأداء أو في تخصيص الذاكرة بين كتابة التعبير الصريح arr[0:3, :] والتعبير المختصر arr[:3, :]؛ فكلاهما يُترجم داخلياً إلى نفس مسار المؤشرات والخطوات الحركية. إلا أن التعبير الأخير يعتبر هو الأسلوب المعياري المفضل والموصى به برمجياً في مجتمع بايثون، نظراً لكونه أكثر وضوحاً، ويقلل من الضوضاء البصرية داخل الأكواد، ويجعل نية المطور واضحة بجلاء في استهداف قمة المصفوفة.

4.3 تقطيع الصفوف من فهرس محدد وحتى النهاية

على الطرف النقيض من الحالة السابقة، تقتضي بعض متطلبات التحليل استبعاد الصفوف الاستهلالية أو التمهيدية (مثل فترات الإحماء في المحاكاة الحاسوبية أو الأسطر الترويسية المشفرة) والتركيز التام على استخراج الصفوف السفلية وحتى نهاية البيانات. يتم صياغة التقطيع الطرفي للصفوف بالصورة: arr[start:, :]، حيث يُحدد مؤشر البداية ويُترك موضع التوقف شاغراً بعد النقطتين الرأسيتين.

عند تنفيذ هذه الصياغة على مصفوفة التجربة عبر كتابة: bottom_slice = arr[3:, :]، يتولى المحرك البرمجي توجيه المؤشر إلى الصف ذي الفهرس 3، ثم ينطلق مستخرجاً جميع الصفوف المتعاقبة حتى آخر عنصر في المصفوفة الأصلية. وبالتالي، فإن الصفوف المشمولة في هذه العملية هي الصفوف 3 و 4 و 5، والتي تشتمل على القيم من 12 إلى 23، لتعطي مصفوفة فرعية بأبعاد (3, 4) تعكس بدقة النصف السفلي من البيانات الكلية.

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

5. الطريقة الثانية: تقطيع الأعمدة المحددة (Column Slicing)

5.1 التطبيق العملي لاختيار نطاق أعمدة عبر الصيغة arr[:, start:stop]

يمثل تقطيع الأعمدة العملية المحورية في هندسة الخصائص وإدارة الجداول الرياضية، حيث تترتب المتغيرات التفسيرية أو الخصائص الإحصائية رأسياً داخل الأعمدة. لاقتطاع نطاق رأسي محدد يمتد عبر كافة الصفوف، نعتمد على وضع النقطتين الشاملتين : في موضع الصفوف، متبوعين بنطاق الاستقطاع المستهدف في موضع الأعمدة وفق الصيغة: arr[:, start:stop].

لنقم بتطبيق ذلك عملياً لاقتطاع الخصائص الوسيطة في مصفوفة النموذج الأساسية عبر تنفيذ العبارة البرمجية التالية:

sub_columns = arr[:, 1:3]

يقوم النظام في هذه الحالة بمطالعة كل صف من الصفوف الستة المكونة للمصفوفة الأصلية، ولكنه يستخرج حصراً القيم الواقعة في العمود ذي الفهرس 1 والعمود ذي الفهرس 2، مستبعداً بالكامل العمود التمهيدي الأول (الفهرس 0) والعمود الختامي الأخير (الفهرس 3). تتألف المصفوفة الفرعية الناتجة sub_columns من 6 صفوف وعمودين، مما يمنحها شكلاً بيانياً قياسياً بأبعاد (6, 2) كما تظهره القيم العددية المستخرجة:

الصف 0: [1, 2]
الصف 1: [5, 6]
الصف 2: [9, 10]
الصف 3: [13, 14]
الصف 4: [17, 18]
الصف 5: [21, 22]

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

5.2 تقطيع الأعمدة البدائية من بداية المصفوفة

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

بتطبيق هذا التعبير لاستخراج أول عمودين من المصفوفة التجريبية: left_slice = arr[:, :2]، يُسند المحرك الحسابي القيمة صفر للبداية ويتحرك عبر كل صف مقتطعاً العمودين 0 و 1 فقط. ينتج عن ذلك مصفوفة جديدة ذات أبعاد (6, 2) تحتوي على النصف الرأسي الأيسر من المصفوفة برمتها. وتظهر هذه المصفوفة مشحونة بالأرقام الزوجية الأولى والخصائص الابتدائية التي يمكن دراستها بمعزل عن باقي البيانات.

تتميز هذه التقنية بالسرعة الميدانية؛ حيث تُستخدم بكثرة في مراحل تنقية وتنظيم الأطر الرياضية قبل إدخالها إلى شبكات التعلم العميق. فعلى سبيل المثال، عند التعامل مع مصفوفات التتبع الكينماتيكي للأجسام، يمثل العمودان الأول والثاني إحداثيات الموقع ثنائي الأبعاد (X, Y)، في حين تمثل الأعمدة التالية متجهات السرعة والتسارع؛ مما يجعل صياغة arr[:, :2] الوسيلة الأسهل لعزل المكونات المكانية الصرفة بضغطة زر برمجية واحدة.

5.3 تقطيع الأعمدة المتأخرة حتى نهاية المصفوفة

على العكس من استخلاص البدايات، يتطلب العمل الحسابي في مجالات كثيرة تجاوز الأعمدة الاستهلالية والتركيز التام على استخراج المتغيرات التحليلية الختامية المتراصة في الجهة اليمنى من شبكة المصفوفة. نستخدم في هذا السيناريو صياغة التقطيع الرأسي المتأخر المكتوبة على النحو التالي: arr[:, start:].

لتطبيق ذلك على مصفوفة العمل، نكتب: right_slice = arr[:, 2:]. يقوم هذا التعبير البرمجي بإسقاط أول عمودين (0 و 1) من كافة الصفوف، وينطلق بدءاً من العمود ذي الفهرس 2 وحتى بلوغ الحافة اليمنى القصوى للمصفوفة (العمود 3). ينتج عن ذلك مصفوفة بأبعاد (6, 2) تضم كافة البيانات المتأخرة في كل صف، والتي تتطابق قيمها مع [2, 3]، [6, 7]، [10, 11] وهكذا دواليك وصولاً إلى [22, 23].

تمنح هذه الطريقة مرونة فائقة لأكواد المعالجة الرياضية، خاصة عند التعامل مع مصفوفات ديناميكية تتغير أبعاد أعمدتها تبعاً لمصادر تدفق البيانات (Data Streaming). فعندما يصمم المبرمج خوارزمية تهدف إلى تجاوز عمودين تعريفيين ثابتين واستخلاص جميع المتغيرات اللاحقة مهما كان عددها الإجمالي، فإن الصياغة arr[:, 2:] تتكيف تلقائياً مع المصفوفات التي تحوي 5 أعمدة أو 1000 عمود بنفس الأناقة والموثوقية وبدون أدنى حاجة للتعديل اليدوي.

6. الطريقة الثالثة: التقطيع المتزامن للصفوف والأعمدة معاً

6.1 بناء مصفوفة فرعية محددة الزوايا (Submatrix Extraction)

تتجلى القوة الهندسية الحقيقية لتقنية التقطيع في نمباي عند دمج نطاقات الصفوف والأعمدة بصورة متزامنة داخل نفس التعبير البرمجي؛ مما يتيح استخراج كتلة هندسية أو “مصفوفة فرعية” (Submatrix Extraction) محددة الزوايا والإحداثيات. تتحقق هذه العملية عبر وضع نطاق الصفوف في الموضع الأول، ونطاق الأعمدة في الموضع الثاني مفصولين بفاصلة: arr[row_start:row_stop, col_start:col_stop].

دعونا نخضع هذا التركيب الثنائي للتحليل العملي المباشر عبر تنفيذ الصياغة التالية على مصفوفة التجربة:

sub_matrix = arr[2:5, 1:3]

تقوم هذه العملية البرمجية بحساب “منطقة التقاطع الرياضي” الصارمة بين الصفوف المحددة والأعمدة المحددة. فالصفوف المستهدفة هي الصفوف ذات الفهارس [2, 3, 4]، والأعمدة المستهدفة هي الأعمدة ذات الفهارس [1, 2]. عند تقاطع هذين النطاقين معاً، تنشأ مصفوفة فرعية رباعية الزوايا تتكون من 3 صفوف وعمودين، وتتضمن القيم الحسابية الدقيقة التالية:

الصف الأول المقتطع: [9, 10]
الصف الثاني المقتطع: [13, 14]
الصف الثالث المقتطع: [17, 18]

عند معاينة أبعاد هذه المصفوفة الفرعية عبر sub_matrix.shape، نجد أنها تعكس الرتبة (3, 2). يوضح هذا الإجراء كيف يمكن للمطور عزل نافذة معلوماتية بالغة الدقة تقع في قلب مصفوفة البيانات المعقدة بخطوة حسابية واحدة ودون تشكيل أي تعقيدات برمجية أو إهدار لوقت المعالجة.

6.2 اقتطاع الكتل الهامشية والمناطق المركزية

يمثل استخراج الكتل المركزية وتجريد الهوامش المحيطية ركيزة لا غنى عنها في العديد من التخصصات الفيزيائية والحسابية؛ حيث تتأثر حواف المصفوفات دائماً بظواهر “شروط الحدود” (Boundary Conditions) أو التشوهات والضوضاء الرقمية، مما يتطلب عزل النواة الداخلية للمصفوفة. يتم تحقيق ذلك برمجياً عبر تقليص نطاق الصفوف والأعمدة بمقدار عنصر واحد من كافة الاتجاهات، كأن نكتب على مصفوفة أبعادها (6, 4):

center_core = arr[1:5, 1:3]

تستبعد هذه العبارة الصف العلوي الأول (0)، والصف السفلي الأخير (5)، وتستبعد العمود الأيسر (0)، والعمود الأيمن (3)، مستخلصة بذلك كتلة مركزية نقية ذات أبعاد (4, 2) تحتوي على لب البيانات الداخلي. وعلى النقيض من ذلك، يمكن للتقطيع المتزامن استهداف الكتل الهامشية والزوايا الرباعية للمصفوفة؛ فمثلاً يمثل التعبير arr[:2, :2] اقتطاعاً للزاوية العلوية اليسرى بمقاس (2, 2)، في حين يمثل arr[4:, 2:] اقتطاعاً للزاوية السفلية اليمنى بمقاس (2, 2).

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

6.3 الدمج بين الفهرسة المفردة والتقطيع النطاقي وتأثيرها على الأبعاد

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

إذا قمنا بكتابة العبارة التالية: row_vector = arr[2, 1:3]، فإننا هنا ندمج بين فهرس عددي مفرد للصف (وهو الرقم 2) ونطاق تقطيع للأعمدة (من 1 إلى 3). يترتب على استخدام الفهرس المفرد حدوث ما يُعرف باسم “تراجع أو انهيار الأبعاد” (Dimensionality Collapse)؛ حيث تسقط رتبة البعد الأول تماماً، وتتحول النتيجة من مصفوفة ثنائية الأبعاد إلى “متجه خطي أحادي البعد” (1D Array) يحتوي على العنصرين [9, 10] وتكون أبعاده البرمجية المسجلة هي (2,) فقط.

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

7. التقطيع المتقدم بالخطوات وفترات القفز المتعددة

7.1 تطبيق خطوة التخطي على الصفوف (Row Striding)

لا تتوقف مرونة نمباي عند مجرد استخراج المقاطع المتجاورة، بل تمتد لتشمل التحكم الدقيق في وتيرة المرور المكاني عبر المعيار الثالث للتقطيع وهو الخطوة الحركية step. تتخذ الصيغة العامة لإدراج معامل الخطوة في نطاق الصفوف الصورة: arr[start:stop:step, :]، مما يتيح للمبرمج تخطي عدد محدد من الصفوف بانتظام رياضي ثابت أثناء عملية الاستقطاع.

لنتأمل التطبيق العملي التالي على مصفوفة النموذج الأساسية، حيث نرغب في استخراج الصفوف ذات الفهارس الزوجية فقط عبر امتداد المصفوفة الكلي:

even_rows = arr[::2, :]

في هذه الحالة، يبدأ المحرك البرمجي من الصف الأول (الفهرس 0)، ثم يقفز خطوتين ليتجاوز الصف 1 ويقتطع الصف 2، ثم يقفز خطوتين ليتجاوز الصف 3 ويقتطع الصف 4، ليتوقف بعدها لبلوغ نهاية المصفوفة. ينتج عن هذا التخطي مصفوفة فرعية بأبعاد (3, 4) تتضمن حصراً الصفوف 0 و 2 و 4. وبالمثل تماماً، يمكن استخراج الصفوف ذات الفهارس الفردية بسهولة عبر تحديد نقطة الانطلاق لتكون 1، من خلال كتابة التعبير: odd_rows = arr[1::2, :]، والذي يستخرج بدوره الصفوف 1 و 3 و 5 بأبعاد (3, 4).

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

7.2 تطبيق خطوة التخطي على الأعمدة (Column Striding)

بنفس الآلية المتبعة في الصفوف، يمكن تطبيق معامل الخطوة على المحور الرأسي للأعمدة لاقتطاع أعمدة متفرقة وفق وتيرة دورية منتظمة. تتبع هذه العملية الصيغة النحوية العامة التالية: arr[:, start:stop:step]، حيث يتم الإبقاء على كافة الصفوف مع إجبار المحرك الحسابي على القفز الأفقي بين الأعمدة بمقدار القيمة المحددة في step.

إذا قمنا بتطبيق هذه التقنية لاختيار الأعمدة البديلة في مصفوفة النموذج الخاصة بنا عبر كتابة: alternate_cols = arr[:, ::2]، فإن النتيجة المستخلصة ستحافظ على الصفوف الستة كاملة، ولكنها ستقتطع فقط العمودين ذوي الفهارس 0 و 2 مستبعدة الأعمدة 1 و 3. يؤدي ذلك إلى إنتاج مصفوفة فرعية ذات أبعاد (6, 2) تعكس التوزيع العمودي البديل في كل صف عبر التتابع الحسابي.

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

7.3 القفز المزدوج في البعدين الرأسي والأفقي معاً

عند دمج خطوات القفز المتعددة على كلا المحورين الرأسي والأفقي في آن واحد، نصل إلى واحدة من أقوى أدوات الضغط المكاني واستخلاص الأنماط الهندسية عبر الصياغة المشتركة المتقدمة: arr[start:stop:row_step, start:stop:col_step].

لنختبر هذا السلوك الشامل عبر تطبيق القفز المزدوج بخطوة 2 على مصفوفة التجربة بأكملها باستخدام العبارة البرمجية التالية:

coarse_grid = arr[::2, ::2]

تقوم هذه العملية بدمج تقليص الصفوف وتقليص الأعمدة في آن واحد؛ حيث يتم أخذ الصفوف ذات الفهارس الزوجية [0, 2, 4]، وضمن هذه الصفوف المحددة لا يتم استخراج سوى الأعمدة ذات الفهارس الزوجية [0, 2]. ينتج عن هذا التقطيع المزدوج مصفوفة فرعية بالغة التركيز بأبعاد (3, 2)، تقتصر عناصرها على القيم الستة التالية: [[0, 2], [8, 10], [16, 18]]، مما يختزل حجم المصفوفة الأصلية بمقدار الربع تماماً في خطوة حسابية رشيقة.

تستخدم هذه التقنية الحسابية بشكل واسع في الفيزياء الحسابية والميكانيكا الرياضية تحت مفهوم “تخشين الشبكات الحسابية” (Grid Coarsening) في خوارزميات الحلول متعددة الشبكات (Multigrid Methods). كما تُعد الأساس الرياضي المباشر لإنشاء خرائط الصور المتعددة الدقة (MIP Mapping) في الرسوميات الحاسوبية ومعالجة الصور؛ حيث يُعاد توليد نسخ منخفضة الدقة بسرعة خارقة تتيح المعاينة السلسة وتوفر مساحات التخزين العشوائي دون إجهاد خطوط المعالجة الرسومية.

8. الفهرسة السلبية والتقطيع العكسي للمصفوفات

8.1 فلسفة الفهارس السالبة في نمباي

تتبنى مكتبة نمباي الفلسفة الذكية المعتمدة في لغة بايثون والمتعلقة بدعم “الفهارس النسبية السالبة” (Negative Indexing)، وهي آلية حسابية تتيح عنونة البيانات انطلاقاً من نهاية المحور باتجاه بدايته بالعد التنازلي. في هذا النظام الرياضي، يُمنح العنصر الأخير في أي بعد الفهرس النسبي -1، بينما يُمنح العنصر قبل الأخير الفهرس -2، وتتدرج الأرقام تنازلياً بالسالب حتى بلوغ العنصر الأول الذي يعادل سالب طول البعد.

تكمن العبقرية البرمجية للفهرسة السالبة في تحرير المطور من الحاجة إلى معرفة الحجم المطلق لأبعاد المصفوفة لاستخراج العناصر المتطرفة؛ فبدلاً من كتابة تعبيرات معقدة تتطلب استدعاء طول المصفوفة مثل arr[arr.shape[0] - 1, :]، يكفي كتابة التعبير البسيط والمباشر arr[-1, :] لاستخراج الصف الأخير بالكامل. يضمن هذا الأسلوب البرمجي كتابة شفرات نظيفة، ومختصرة، ومقاومة لأخطاء تجاوز حدود الذاكرة (Out of Bounds Errors) التي تحدث بكثرة عند تعديل أحجام المصفوفات ديناميكياً.

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

8.2 تقطيع النطاقات السلبية للصفوف والأعمدة

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

لنتأمل على سبيل المثال استخراج الصفوف الثلاثة الواقعة قبل الصف الأخير في مصفوفة النموذج عبر الصياغة التالية:

tail_rows = arr[-4:-1, :]

في مصفوفة تتكون من 6 صفوف، يقابل الفهرس -4 الصف ذي الفهرس الإيجابي 2، بينما يقابل الفهرس -1 الصف ذي الفهرس الإيجابي 5. وبتطبيق قاعدة استبعاد نقطة النهاية، فإن المقطع المستخرج سيشمل الصفوف ذات الفهارس 2 و 3 و 4، مستبعداً الصف الأخير ذي الفهرس 5 (المقابل لـ -1). وبالمثل تماماً، يمكن تقطيع الأعمدة بالسالب عبر كتابة: arr[:, -3:-1]، والتي تستقطع العمودين قبل الأخيرين عبر جميع الصفوف بكفاءة تامة وتنتج مصفوفة ذات أبعاد (6, 2).

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

8.3 عكس اتجاه محاور المصفوفة باستخدام الخطوات السالبة

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

إذا قمنا بكتابة التعبير البرمجي: reversed_rows = arr[::-1, :]، فإننا بذلك نوجه نمباي لعكس ترتيب الصفوف بالكامل؛ حيث يصبح الصف السادس الأخير هو الصف الأول في المصفوفة الناتجة، يليه الصف الخامس، نزولاً إلى الصف الأول الأصلي الذي يستقر في قاع المصفوفة المعكوسة. وبصورة موازية، إذا طبقنا الخطوة السالبة على الأعمدة عبر كتابة: reversed_cols = arr[:, ::-1]، يتم عكس ترتيب الأعمدة من اليمين إلى اليسار رأسياً، فيتحول العمود الأخير إلى العمود الأول مع بقاء ترتيب الصفوف أفقياً كما هو دون تغيير.

والأكثر إثارة هو إمكانية دمج الخطوتين السالبتين في البعدين معاً عبر الصياغة الرياضية الشاملة:

fully_inverted = arr[::-1, ::-1]

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

9. العرض مقابل النسخ وإدارة الذاكرة في نمباي

9.1 مفهوم العرض الميموري (Views) في عمليات التقطيع

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

يُعرف هذا السلوك الهندسي باسم “السلوك الصفري للنسخ” (Zero-copy behavior)، وهو السر وراء السرعة الخارقة لعمليات التقطيع في نمباي، حيث لا تستهلك العملية أي مساحة إضافية من ذاكرة الوصول العشوائي (RAM) بصرف النظر عن ضخامة حجم المصفوفة؛ سواء كانت تحوي عشرة أرقام أو مئة مليون رقم. تقتصر العملية البرمجية فقط على إنشاء ترويسة كائنية صغيرة (Header) تتضمن مؤشر الذاكرة، والأبعاد الجديدة (Shape)، والخطوات الحركية المحسوبة (Strides).

للتحقق البرمجي الصارم مما إذا كانت المصفوفة الفرعية المستخرجة عبارة عن عرض ميموري للمصفوفة الأم أم أنها كائن مستقل، توفر نمباي الخاصية المرجعية base. إذا كانت المصفوفة المقطوعة عبارة عن عرض (View)، فإن فحص sub_arr.base سيعيد كائن المصفوفة الأصلية بالكامل دلالة على اعتماده الميموري عليها، في حين سيعيد القيمة None إذا كانت المصفوفة نسخة مستقلة تمتلك مساحتها الذاكرية الخاصة.

9.2 التعديل المشترك وتداعيات الآثار الجانبية (Side Effects)

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

لنتأمل هذا المثال التوضيحي المباشر: إذا قمنا باقتطاع شريحة علوية من المصفوفة الأصلية عبر sub_view = arr[:2, :2]، ثم قمنا بتعديل العنصر الأول في هذه الشريحة بكتابة: sub_view[0, 0] = 999، سنجد بمجرد طباعة المصفوفة الأصلية arr أن قيمتها عند الموقع [0, 0] قد تحولت هي الأخرى إلى 999 بشكل متزامن. يحدث هذا التغيير لأن التعديل طال خانة البايتات الحقيقية في الذاكرة التي ينظر إليها كلا المتغيرين.

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

9.3 النسخ الصريح للمصفوفات المقطوعة (Explicit Copying)

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

isolated_sub = arr[2:5, 1:3].copy()

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

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

10. تقنيات متقدمة مكملة للتقطيع: الدمج مع الفهرسة الشرطية والمتجهات

10.1 تقطيع المقاطع المحددة شرطياً (Slicing with Boolean Masks)

يتجاوز التقطيع في نمباي مجرد استقطاع المقاطع المنتظمة هندسياً ليتكامل بتناغم مذهل مع “الفهرسة المنطقية الشرطية” (Boolean Mask Indexing)؛ مما يتيح للمطورين تطبيق شروط رياضية منطقية بالغة التعقيد على نوافذ مكانية محددة بدقة داخل المصفوفة ثنائية الأبعاد، دون التأثير على سائر النطاقات المحيطة.

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

mask = arr[2:5, 1:3] > 10

ينتج عن هذه العبارة مصفوفة منطقية ثنائية الأبعاد بنفس أبعاد الشريحة المكانية، حيث تتضمن القيمة True أمام العناصر التي تتجاوز القيمة 10، والقيمة False أمام ما عداها. يمكن بعد ذلك استخدام هذا القناع لاستهداف وتعديل تلك القيم المحددة داخل تلك الرقعة حصراً عبر كتابة: arr[2:5, 1:3][mask] = 0؛ مما يؤدي إلى تصفير الأرقام التي تجاوزت العتبة المحددة داخل تلك النافذة المقطوعة فقط مع ترك باقي المصفوفة الأصلية سالمة من أي تغيير.

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

10.2 الجمع بين التقطيع العادي والفهرسة المتقدمة (Fancy Indexing)

تتيح مكتبة نمباي دمج التقطيع القياسي مع ما يُعرف اصطلاحاً باسم “الفهرسة المتقدمة” (Fancy Indexing)، وهي التقنية التي تعتمد على تمرير قوائم أو مصفوفات من الأعداد الصحيحة لتحديد فهارس غير منتظمة وغير متتالية على أحد المحاور، بالتزامن مع تطبيق نطاق تقطيع منتظم على المحور الآخر.

لنتأمل المثال العملي التالي، حيث نرغب في استخراج الصفوف ذات الفهارس [0, 2, 5] (وهي صفوف غير متتالية يستحيل استخراجها بنطاق تقطيع دوري بسيط) ولكننا نريد في الوقت ذاته استخراج نطاق الأعمدة المتصلة من العمود 1 إلى العمود 3 لتلك الصفوف:

fancy_sub = arr[[0, 2, 5], 1:3]

يقوم المحرك الحسابي لنمباي ببراعة بتوجيه مؤشراته لانتقاء الصفوف المذكورة في القائمة فقط، ثم يطبق عليها استقطاع الأعمدة المطلوب لينتج مصفوفة ثنائية الأبعاد بأبعاد (3, 2) تجمع بين التخصيص غير المنتظم والتقطيع النطاقي المنتظم.

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

10.3 التعديل الجماعي للقيم عبر التقطيع (Broadcasting Assignment)

تتضافر قوة التقطيع المكاني مع ميكانيكية “البث الإحصائي” (Broadcasting) في نمباي لتقديم واحدة من أروع الميزات الحوسبية: وهي القدرة على إسناد وتعديل كتل كاملة من البيانات دفعة واحدة ودون استخدام حلقات تكرار، من خلال ما يُعرف باسم “الإسناد عبر التقطيع” (Broadcasting Assignment).

يتيح هذا النمط إسناد قيمة عددية مفردة (Scalar) لكامل المقطع المقتطع بضربة برمجية واحدة؛ فعلى سبيل المثال، تؤدي كتابة العبارة التالية: arr[1:4, 1:3] = 0 إلى قيام نمباي ببث الرقم صفر وتكراره برمجياً ليغطي جميع الخلايا الست المكونة لتلك النافذة المقطوعة وتصفيرها بالكامل في خطوة زمنية متناهية الصغر. كما يمكن إسناد متجه أحادي البعد إلى نطاق تقطيع ثنائي الأبعاد، كأن نكتب: arr[1:4, 1:3] = [88, 99]، حيث يقوم محرك البث تلقائياً بنسخ هذا المتجه المكون من قيمتين وتطبيقه بالتساوي على كل صف من الصفوف الثلاثة المشمولة في نطاق التقطيع.

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

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

11.1 الخلط بين بناء بايثون القياسي وبناء نمباي المتعدد

من أكثر الأخطاء الشائعة انتشاراً بين المطورين، خاصة أولئك القادمين حديثاً من بيئة بايثون القياسية إلى مكتبة نمباي، هو الخلط بين صياغة السلاسل المتسلسلة لقوائم بايثون وبين صياغة الأبعاد المتعددة الموحدة لنمباي؛ حيث يعمد البعض إلى كتابة التقطيع المتعدد عبر أقواس متتالية مثل: arr[2:5][1:3] بدلاً من كتابة الصيغة الصحيحة الموحدة: arr[2:5, 1:3].

على الرغم من أن الصياغة الخاطئة arr[2:5][1:3] قد لا تُحدث في كثير من الأحيان خطأً صريحاً يوقف البرنامج (Syntax Error)، إلا أنها تؤدي إلى كارثة منطقية وتنتج نتائج حسابية مغايرة تماماً لما يرجوه المبرمج. فما يحدث فعلياً خلف الكواليس هو أن بايثون تقوم أولاً بتنفيذ التعبير الأول arr[2:5] لينتج مصفوفة وسيطة مكونة من ثلاثة صفوف (الصفوف 2 و 3 و 4 من المصفوفة الأصلية بكامل أعمدتها). ثم يأتي التعبير الثاني [1:3] ليطبق عملية تقطيع جديدة على تلك “المصفوفة المؤقتة الناتجة”، ولأن الأقواس لا تحتوي على فاصلة، فإن بايثون تعامل هذا التعبير على أنه تقطيع للصفوف مجدداً، فيقتطع الصفين 1 و 2 من تلك المصفوفة المؤقتة!

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

11.2 سوء فهم الحدود الشاملة والمستبعدة (Off-by-one errors)

تمثل “أخطاء الزيادة أو النقص بواحد” (Off-by-one errors) واحداً من أقدم وأعقد التحديات المنطقية في علوم الحوسبة، وتبرز بكثافة في عمليات التقطيع نتيجة لسوء الفهم الشائع لطبيعة المجال نصف المفتوح [start:stop) المعتمد في نمباي؛ حيث ينسى كثير من المطورين أن فهرس النهاية stop مستبعد بالكامل ولا يتم الوصول إليه أبداً.

يتجلى هذا الخطأ بوضوح عندما يرغب الباحث في استخراج الأعمدة الثلاثة الأولى في مصفوفة ما (الأعمدة 0 و 1 و 2)، فيقوم بكتابة التعبير البرمجي: arr[:, 0:2] ظناً منه أن الرقم 2 يعني تضمين العمود الثاني. النتيجة الكارثية هنا هي أن المحرك سيستخرج فقط العمودين 0 و 1، متجاهلاً العمود المطلوب ومسبباً نقصاً في البيانات الإحصائية قد يقود إلى فشل كامل في تدريب النماذج الرياضية لاحقاً. ولتصحيح هذا الخلل، يجب كتابة arr[:, 0:3] أو arr[:, :3] لضمان بلوغ العنصر المستهدف.

لتفادي الوقوع في هذه المزالق المنطقية، يتعين على المطورين تبني تقاليد التدقيق البرمجي المستمر؛ والتي تتضمن الفحص الدائم لأبعاد المصفوفات الناتجة فور كل عملية تقطيع عبر استدعاء sub_arr.shape، واستخدام عبارات التوكيد الرياضي (Assertions) لمطابقة عدد الصفوف والأعمدة المستخرجة مع المتطلبات الحسابية الفعلية للخوارزمية قبل الانتقال للخطوات المعالجة اللاحقة.

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

يواجه المطورون في كثير من الأحيان ظهور مصفوفات مقتطعة ذات أبعاد صفرية أو مصفوفات فارغة بالكامل مثل array([], shape=(0, 4)) دون إطلاق رسائل خطأ صريحة من المفسر البرمجي؛ مما يسبب ارتباكاً كبيراً وتعطلاً غامضاً في مراحل المعالجة اللاحقة.

تحدث هذه الظاهرة عادة عندما يتم تحديد نطاق تقطيع غير منطقي رياضياً بالنظر إلى اتجاه خطوة السير الحركية؛ كأن يقوم المبرمج بكتابة نطاق تكون فيه نقطة البداية أكبر من نقطة النهاية مع الاحتفاظ بخطوة سير موجبة افتراضياً، مثل كتابة: arr[4:2, :]. في هذه الحالة، ولأن الانتقال من 4 إلى 2 يتطلب خطوة سالبة بينما الخطوة الافتراضية هي +1، فإن محرك نمباي يعتبر النطاق مستحيلاً رياضياً ويغلق العملية فوراً بإرجاع مصفوفة فارغة ذات صفر صفوف وأربعة أعمدة.

تتم معالجة هذه الحالات البرمجية عبر التحقق الدقيق من توافق إشارات الخطوات مع ترتيب مؤشرات البداية والنهاية؛ فإذا كان المطلوب هو السير العكسي من الأكبر إلى الأصغر، فيتعين كتابة الخطوة السالبة صراحة كأن نكتب arr[4:2:-1, :]. كما يُنصح دائماً بإدراج اختبارات تفقدية قبلية على المصفوفات المتغيرة، مثل فحص الحجم الإجمالي للعناصر عبر sub_arr.size > 0 لضمان احتواء المقطع على بيانات حقيقية صالحة للتحليل الرياضي قبل الشروع في تمريرها للخوارزميات المتقدمة.

12. تطبيقات ودراسات حالة عملية لتقطيع المصفوفات ثنائية الأبعاد

12.1 معالجة الصور الرقمية وتحليل النطاقات اللونية

تعتبر معالجة الصور الرقمية المختبر الأبرز والميدان التطبيقي الأوسع لتقنيات تقطيع مصفوفات نمباي ثنائية الأبعاد؛ فالصورة الرقمية أحادية اللون (Grayscale Image) ما هي إلا مصفوفة أرقام ثنائية الأبعاد، تتراوح قيم خلاياها عادة بين 0 (للدلالة على السواد التام) و 255 (للدلالة على البياض الناصع)، حيث يمثل كل رقم شدة إضاءة بكسل محدد في الفضاء المكاني للصورة.

عند بناء أنظمة الرؤية الحاسوبية لاكتشاف الوجوه أو لوحات السيارات، تقوم خوارزميات الاستكشاف بتوليد إحداثيات ما يُعرف باسم “مربع الإحاطة” (Bounding Box) بالصيغة (y, x, h, w)، حيث تمثل y و x إحداثيات نقطة الانطلاق العلوية، بينما تمثل h و w الارتفاع والعرض على التوالي. باستخدام تقطيع نمباي، يمكن استخراج الوجه المعزول برقعة بكسلية فائقة الدقة في خطوة برمجية واحدة عبر كتابة:

face_roi = image[y:y+h, x:x+w]

علاوة على ذلك، يُستخدم التقطيع بكثافة لإضافة إطارات رقمية (Paddings) أو إطارات حماية للصورة عبر إسناد قيم ثابتة لهوامش المصفوفة دفعة واحدة، كأن نكتب لتسويد الحواف العلوية والسفلية: image[:10, :] = 0 و image[-10:, :] = 0. كما يُعتمد على التقطيع النسبي المتقاطع لتطبيق خوارزميات الطرح المكاني السريعة لحساب التدرجات اللونية والكشف عن الحواف (Edge Detection) بمقارنة المصفوفة مع مقاطع مزاحة من نفسها مثل diff = image[:, 1:] - image[:, :-1]، محققاً بذلك سرعة فائقة تضاهي سرعة المعالجة في النظم المدمجة الفورية.

12.2 تقسيم البيانات في النمذجة الإحصائية وتعلم الآلة

في بيئات تعلم الآلة وهندسة النظم التنبؤية، يتم تنظيم مجموعات البيانات المجدولة بصورة نمطية في مصفوفات ثنائية الأبعاد عملاقة؛ حيث تخصص الصفوف لتمثيل المشاهدات أو العينات الفردية (Observations)، بينما تخصص الأعمدة لتمثيل الخصائص التنبؤية المستقلة (Features)، ويكون العمود الأخير غالباً مكرساً لتسجيل المتغير التابع أو القيمة المستهدفة بالتنبؤ (Target Label).

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

X = dataset[:, :-1]
y = dataset[:, -1]

يقوم السطر الأول باقتطاع كافة الصفوف مع استبعاد العمود الأخير فقط لينتج مصفوفة الخصائص ثنائية الأبعاد X، بينما يتولى السطر الثاني استخلاص العمود الختامي بمفرده كمتجه تصنيفي y. يتبع ذلك مباشرة استخدام التقطيع النطاقي الموجه للصفوف لتقسيم البيانات إلى مجموعات تدريب واختبار (Train/Test Split)؛ حيث يتم تخصيص النسبة الأكبر (مثل أول 80% من الصفوف) لعمليات التدريب عبر كتابة: X_train = X[:split_idx, :]، في حين تُخصص النسبة المتبقية للاختبار عبر: X_test = X[split_idx:, :].

كما يلعب التقطيع دوراً محورياً في النمذجة الإحصائية للسلاسل الزمنية (Time Series Analysis)، حيث يُستخدم لبناء “النوافذ الزمنية المنزلقة” (Sliding Windows) للتنبؤ بالقيم المستقبلية استناداً إلى أطر زمنية سابقة، عبر تقطيع متتالٍ لصفوف المصفوفة بنوافذ متقدمة الخطوات الحركية تغذي خوارزميات الشبكات التكرارية (RNN) ونماذج التنبؤ الإحصائي بدقة متناهية.

12.3 أفضل الممارسات البرمجية لكتابة أكواد تقطيع معيارية ومقروءة

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

تتمثل أولى هذه الممارسات المتقدمة في استخدام “كائنات التقطيع الصريحة” عبر دالة بايثون المدمجة slice() لتمثيل المقاطع المعقدة القابلة لإعادة الاستخدام. فبدلاً من كتابة تعبيرات رقمية غامضة داخل الأقواس في عدة مواضع متفرقة من النظام، يمكن تعريف كائن تقطيع يحمل اسماً دلالياً واضحاً، كأن نكتب: feature_window = slice(10, 50, 2)، ثم تطبيقه لاحقاً على مصفوفات متعددة عبر الصياغة المقروءة: arr[:, feature_window]. يضمن هذا النهج سهولة التعديل المركزي لمحددات الاستقطاع في موضع واحد دون الحاجة للبحث في أرجاء الشفرة البرمجية.

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

  • arr[i, :]: استخراج الصف رقم i كاملاً مع تراجع الأبعاد لمتجه أحادي.
  • arr[i:i+1, :]: استخراج الصف رقم i كاملاً مع الحفاظ الصارم على الرتبة ثنائية الأبعاد (2D).
  • arr[:, j]: استخراج العمود رقم j كاملاً عبر كافة الصفوف مع تراجع الأبعاد.
  • arr[:, j:j+1]: استخراج العمود رقم j كاملاً مع الحفاظ على الرتبة ثنائية الأبعاد.
  • arr[r1:r2, c1:c2]: استخراج مصفوفة فرعية متزامنة محددة بالصفوف من r1 إلى r2 وبالأعمدة من c1 إلى c2.
  • arr[::step, :]: تقليص دقة الصفوف رأسياً بالقفز الدوري بمقدار الخطوة المحددة.
  • arr[::-1, :]: عكس الترتيب الرأسي للصفوف من الأسفل إلى الأعلى.
  • arr[:, ::-1]: عكس الترتيب الأفقي للأعمدة من اليمين إلى اليسار.
  • arr.copy(): فك الارتباط الميموري وإنشاء نسخة مادية مستقلة تماماً في الذاكرة.

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

خاتمة

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

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

المراجع

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

0.0 / 5 0 تقييمات

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

looti, M. (2026, سبتمبر 18). كيفية تقطيع مصفوفة نمباي ثنائية الأبعاد (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-slice-2d-numpy-array-with-examples/
looti, Mohammed. “كيفية تقطيع مصفوفة نمباي ثنائية الأبعاد (مع أمثلة).” عرب سايكلوجي, 18 سبتمبر 2026, https://arabpsychology.com/statistics/how-to-slice-2d-numpy-array-with-examples/.
looti, Mohammed. “كيفية تقطيع مصفوفة نمباي ثنائية الأبعاد (مع أمثلة).” عرب سايكلوجي. سبتمبر 18, 2026. https://arabpsychology.com/statistics/how-to-slice-2d-numpy-array-with-examples/.