نجح التقسيم الأفقي لمدخل أحادي في مثالنا، بينما رُفض طلب محور ثانٍ صراحة.
حدد المحور من شكل المدخل
hsplit يختار المحور 0 للمدخل الأحادي، والمحور 1 للجدول الثنائي هنا. [1]
نسأل عن معنى اسم العملية حين يعرض المحرر قائمة أعداد على سطر واحد. هذا العرض لا يضيف محورًا إلى البيانات. نقرأ وصف الشكل المسجل قبل أن نترجم كلمة «أفقي» إلى رقم محور.
في مثالنا، x ذات شكل (4,)، أي أربعة مواضع على محور واحد. أما A ذات شكل (2,4)، ففيها مواضع صفوف ومواضع أعمدة. الرقم 4 يتكرر في الوصفين لكنه لا يجعل عدد المحاور متساويًا.
نؤلف الأعداد لأغراض تعليمية، ولا نسميها قراءات جهاز أو درجات طلاب. هدفنا فصل مواضع متتابعة إلى أجزاء مع تتبع القيم وشكل كل جزء، وليس قسمة قيمة كل عدد على اثنين.
لذلك نسجل أربعة أشياء مع الناتج: شكل المدخل، واسم واجهة التقسيم، وعدد الأجزاء، وأشكال الأجزاء. نجاح عملية لها اسم قريب لا يحدد المحور الذي استعملته عملية أخرى.
تابع المتجه والطلب المرفوض
أنشأنا x=np.array([9,-2,0,6],dtype=np.int64). في NumPy 2.3.5 على CPython 3.12.14، أعادت np.hsplit(x,2) [9,-2] ثم [0,6]. كل جزء من int64 وبالشكل (2,).
نرقم المواضع من صفر إلى ثلاثة. الجزء الأول يأخذ الموضعين 0 و1، والثاني 2 و3. العدد صفر في الجزء الثاني قيمة موجودة في المصدر، وليس علامة على جزء خالٍ.
نفذنا np.split(x,2,axis=0) فحصلنا على الجزأين نفسيهما في القيم. هنا يوجد المحور المطلوب، وطوله أربعة، وقد طلبنا جزأين بطول اثنين لكل منهما.
ثم نفذنا np.split(x,2,axis=1) دون تغيير x، فارتفع IndexError. سجلنا نوع الاستثناء الذي شوهد في هذا التنفيذ. لا توجد نتيجة تقسيم نقارنها بالجزأين السابقين من هذه المحاولة.
عند np.vsplit(x,2) ارتفع ValueError. هذا أيضًا مخرج تنفيذنا المحدد، وليس استنتاجًا بأن أي كلمة «تقسيم» تقبل المتجه ما دام طوله يقبل القسمة على اثنين.
نجاح الطلب الأول لا يضيف محورًا ثانيًا إلى x. شكلها بقي (4,)، وبايتاتها بقيت كما كانت. لا نفسر اسم العملية وحده باعتباره وصفًا لكل الشروط التي فحصتها الواجهة.
لم نختبر هنا عدد أجزاء لا يقسم الطول، أو قائمة مواضع قطع، أو مدخلًا بلا محاور. لا نحتاج إلى تعميم نوع استثناء المحور غير الموجود على تلك الطلبات لكي نفهم نجاح hsplit في المثال.
قارن الأعمدة بالصفوف
vsplit يقسم الجدول على المحور 0. [2]
ننشئ A=np.array([[9,-2,0,6],[1,7,-3,4]],dtype=np.int64) بالشكل (2,4). الصف الأول يحمل أعداد x نفسها، والصف الثاني مؤلف استقلالًا. لم ننشئ A باستدعاء reshape على x ذات أربع خانات.
أعادت np.hsplit(A,2) أولًا [[9,-2],[1,7]]، ثم [[0,6],[-3,4]]. لكل جزء صفان وعمودان، أي الشكل (2,2)، والنوع int64. بقي كل عمود مرتبطًا بقيمتيه عبر الصفين.
في الجزء الأول، العمود المحلي 0 يعود إلى العمود الأصلي 0، والمحلي 1 إلى الأصلي 1. في الجزء الثاني، المحلي 0 يعود إلى الأصلي 2، والمحلي 1 إلى الأصلي 3. الصفر المحلي لا يعني العودة إلى أول عمود من الأصل.
أما np.vsplit(A,2) فأعادت [[9,-2,0,6]] ثم [[1,7,-3,4]]. شكل كل جزء (1,4)، والنوع int64. أخذنا الصف الأول كاملًا ثم الثاني كاملًا، بدل أخذ أول عمودين ثم آخر عمودين.
طلبنا العدد 2 في المقارنتين، وحصلنا على جزأين في كل منهما. مع ذلك، جزء hsplit الأول يضم 1 و7 من الصف الثاني، وجزء vsplit الأول لا يضمهما. تساوي عدد الأجزاء أو عدد خانات الجزء لا يثبت تطابق أعضائه.
لإعادة A من التقسيم الأفقي في ورقتنا، نجمع أعمدة الصف الأول من الجزأين بالترتيب، ثم أعمدة الصف الثاني. ولإعادتها من التقسيم الآخر، نضع صف الجزء الأول قبل صف الجزء الثاني. نحفظ خريطة المصدر بدل استنتاجها من اسم الملف.

راجع الفحص وحدوده
بنى المرجع أجزاء المتجه بقوائم Python مستقلة. حسب العرض n//k ثم أخذ لكل جزء مجالًا متتابعًا من المواضع. وللجدول، أخذ مجال الأعمدة نفسه من كل صف؛ لم يستخدم split أو hsplit أو vsplit لبناء التوقعات.
اختبرنا الأطوال 2 و4 و6، وكل عدد من −2 و5. للأطوال على الترتيب 4 و16 و64 نمطًا من القيم. أعداد الأجزاء المجربة هي القواسم الموجبة للطول: 1 و2؛ ثم 1 و2 و4؛ ثم 1 و2 و3 و6.
لذلك عدد حالات الشبكة 4×2+16×3+64×4=312. لكل متجه بنينا جدولًا من صفه وصف معكوس الترتيب. هذه طريقة تكوين محددة للصف الثاني في الشبكة، وليست جميع الجداول الممكنة من الشكل نفسه.
راجعنا ثمانية أمور لكل حالة: قيم hsplit للمتجه؛ وأشكالها وأنواعها وعددها؛ وقيم hsplit للجدول وأشكالها وأنواعها؛ والتوافق مع split بمحور صريح؛ واستثناء split مع axis=1 للمتجه؛ واستثناء vsplit للمتجه؛ وأجزاء vsplit للجدول؛ وبقاء المدخلين واستعادة القيم من الأجزاء المتتابعة.
أضفنا ثمانية فحوص مماثلة للمثال الرئيسي وأربعة خاصة بأجزائه وأشكالها المعلنة. الحساب 312×8+8+4=2508، ومرت كلها. تحققت حدود كل شريحة من قوائم Python قبل مقارنة مخرجات المكتبة.
اقتصر التنفيذ على int64 والأشكال المعلنة وأعداد أجزاء موجبة تقسم طول المتجه بالتساوي. لم نفحص تقسيمًا غير متساوٍ أو فهارس قطع أو مدخلًا فارغًا أو بلا محاور أو ثلاثة محاور فأكثر أو أنواعًا أخرى أو تعديل الأجزاء أو ملكية التخزين أو الأداء.
عند تغير عدد المحاور في بياناتك، راجع قاعدة الواجهة قبل إعادة استعمال الاستدعاء. كتابة الأجزاء على سطر أو في جدول بالواجهة لا تكفي؛ الشكل المسجل وخريطة المواضع يوضحان ماذا قسمنا فعلًا.
| المدخل | العملية | أشكال الأجزاء أو الاستثناء |
|---|---|---|
| x / (4,) | hsplit(x,2) | (2,) / (2,) |
| x / (4,) | split(x,2,axis=1) | IndexError |
| x / (4,) | vsplit(x,2) | ValueError |
| A / (2,4) | hsplit(A,2) | (2,2) / (2,2) |
| A / (2,4) | vsplit(A,2) | (1,4) / (1,4) |
للتوسع: أبعاد المصفوفة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
