NumPy: الربط والتقسيم

آخر تحديث: 2026-08-26

الربط والتقسيم

1. ما ستتعلمه




2. قصة حقيقية لمطور

(1) المشكلة

أليس لديها 3 أشهر من بيانات المبيعات، كل شهر كمصفوفة 4×3 (4 منتجات × 3 مناطق). تريد دمجها في جدول واحد كبير لكنها تخلط بين أي محور تستخدمه مع concatenate.

(2) الحل

بوب يرسم مخططًا: "على طول المحور 0، تزداد الصفوف؛ على طول المحور 1، تزداد الأعمدة." concatenate(axis=0) يرص عموديًا، concatenate(axis=1) يرص أفقيًا.

(3) النتيجة

بعد إتقان الربط والتقسيم، تستطيع أليس دمج البيانات الشهرية بأمر واحد، وتقسيمها حسب الربع، واستخدام tile لتوسيع قوالب التنبؤ — تحسن 10 أضعاف في كفاءة تجميع البيانات.




3. المفاهيم الأساسية

(1) np.concatenate — الربط على طول محور

np.concatenate هي دالة الربط الأكثر عمومية، مع معامل axis الذي يتحكم في الاتجاه.

PYTHON
import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6]])

b = np.array([[7, 8, 9],
              [10, 11, 12]])

---
## 4. على طول المحور 0: رص عموديًا (تزداد الصفوف)
c0 = np.concatenate([a, b], axis=0)
---
## 5. [[ 1  2  3]
---
##  6. [ 4  5  6]
---
##  7. [ 7  8  9]
---
##  8. [10 11 12]]

---
## 9. على طول المحور 1: رص أفقيًا (تزداد الأعمدة)
c1 = np.concatenate([a, b], axis=1)
---
## 10. [[ 1  2  3  7  8  9]
---
##  11. [ 4  5  6 10 11 12]]
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.

(2) vstack و hstack

PYTHON
import numpy as np

a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [7, 8]])

---
## 12. vstack: نفس concatenate(axis=0)
v = np.vstack([a, b])
print(v.shape)  # (4, 2)

---
## 13. hstack: نفس concatenate(axis=1)
h = np.hstack([a, b])
print(h.shape)  # (2, 4)
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.

(3) stack — الربط ببعد جديد

stack ينشئ محورًا جديدًا ويربط على طوله:

PYTHON
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])

s = np.stack([a, b, c])
print(s.shape)  # (3, 3)
print(s)
---
## 14. [[1 2 3]
---
##  15. [4 5 6]
---
##  16. [7 8 9]]
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.

(4) split — تقسيم المصفوفات

PYTHON
import numpy as np

a = np.arange(12).reshape(6, 2)

---
## 17. تقسيم إلى 3 أجزاء متساوية
parts = np.split(a, 3)
print(len(parts))  # 3
print(parts[0].shape)  # (2, 2)
print(parts[1].shape)  # (2, 2)
print(parts[2].shape)  # (2, 2)

---
## 18. تقسيم عند فهارس محددة
parts2 = np.split(a, [2, 4])
print([p.shape for p in parts2])  # [(2,2), (2,2), (2,2)]

---
## 19. vsplit: تقسيم على طول المحور 0 (عمودي)
---
## 20. hsplit: تقسيم على طول المحور 1 (أفقي)
v = np.vsplit(a, 3)  # نفس split(a, 3, axis=0)
h = np.hsplit(a, 2)  # تقسيم الأعمدة
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.

(5) repeat و tile

PYTHON
import numpy as np

a = np.array([1, 2, 3])

---
## 21. repeat: تكرار كل عنصر
print(np.repeat(a, 3))  # [1 1 1 2 2 2 3 3 3]

---
## 22. tile: تكرار المصفوفة بأكملها
print(np.tile(a, 3))  # [1 2 3 1 2 3 1 2 3]

---
## 23. tile ثنائي الأبعاد
b = np.array([[1, 2], [3, 4]])
print(np.tile(b, (2, 3)).shape)  # (4, 6)
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.


▶ مثال

TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.

: الربط مقابل التجميع (الصعوبة ⭐)

PYTHON
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print("concatenate:", np.concatenate([a, b]))
---
## 24. [1 2 3 4 5 6]

print("stack:", np.stack([a, b]))
---
## 25. [[1 2 3]
---
##  26. [4 5 6]]

print("vstack:", np.vstack([a, b]))
---
## 27. [[1 2 3]
---
##  28. [4 5 6]]

print("hstack:", np.hstack([a, b]))
---
## 29. [1 2 3 4 5 6]
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.




30. جداول المقارنة

(1) طرق الربط

الدالة axis متطلبات الشكل تغيير الشكل الناتج
concatenate محدد نفس الشيء باستثناء محور الربط مجموع محور الربط
vstack 0 نفس عدد الأعمدة تزداد الصفوف
hstack 1 نفس عدد الصفوف تزداد الأعمدة
stack محور جديد نفس الشكل تمامًا بُعد جديد يُضاف

(2) repeat vs tile

الدالة السلوك مثال
repeat(3) يكرر كل عنصر 3 مرات [1,2][1,1,1,2,2,2]
tile(3) يكرر المصفوفة بأكملها 3 مرات [1,2][1,2,1,2,1,2]

▶ مثال: استخدام array_split للتقسيم غير المتساوي (الصعوبة ⭐⭐)

PYTHON
import numpy as np

a = np.arange(10)

---
## 31. split يتطلب أجزاء متساوية — يظهر خطأ لـ 3 أجزاء
---
## 32. array_split يتعامل مع التقسيم غير المتساوي برشاقة
parts = np.array_split(a, 3)
for i, p in enumerate(parts):
    print(f"Part {i}: shape={p.shape}, values={p}")

---
## 33. array_split ثنائي الأبعاد
b = np.arange(20).reshape(5, 4)
parts_2d = np.array_split(b, 3)
for i, p in enumerate(parts_2d):
    print(f"2D Part {i}: shape={p.shape}")

المخرجات:

TEXT 📖 للعرض فقط
# تم التنفيذ بنجاح

المخرجات:

TEXT 📖 للعرض فقط
Part 0: shape=(4,), values=[0 1 2 3]
Part 1: shape=(3,), values=[4 5 6]
Part 2: shape=(3,), values=[7 8 9]
2D Part 0: shape=(2, 4)
2D Part 1: shape=(2, 4)
2D Part 2: shape=(1, 4)

▶ مثال: repeat و tile لتوسيع البيانات (الصعوبة ⭐)

PYTHON
import numpy as np

a = np.array([1, 2, 3])

---
## 34. repeat: تكرار كل عنصر على حدة
print("repeat:", np.repeat(a, 3))

---
## 35. tile: تكرار المصفوفة بأكملها
print("tile:", np.tile(a, 3))

---
## 36. عملي: توسيع نمط
pattern = np.array([[1, 0], [0, 1]])
grid = np.tile(pattern, (2, 3))
print("Tiled pattern:\n", grid)
print("Shape:", grid.shape)

المخرجات:

TEXT 📖 للعرض فقط
repeat:
tile:
Tiled pattern:\n
Shape:

المخرجات:

TEXT 📖 للعرض فقط
repeat: [1 1 1 2 2 2 3 3 3]
tile: [1 2 3 1 2 3 1 2 3]
Tiled pattern:
 [[1 0 1 0 1 0]
 [0 1 0 1 0 1]
 [1 0 1 0 1 0]
 [0 1 0 1 0 1]]
Shape: (4, 6)



❓ أسئلة شائعة

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

📖 ملخص



📝 تمارين

  1. مبتدئ (الصعوبة ⭐): أنشئ مصفوفتين 3x4 من أرقام عشوائية. اربطهما على طول المحور 0، ثم على طول المحور 1. اطبع أشكال النتائج.

  2. متوسط (الصعوبة ⭐⭐): أنشئ ثلاث مصفوفات أحادية البعد بطول 5. استخدم stack لدمجها في مصفوفة 3x5. ثم استخدم vstack وقارن الأشكال.

  3. متقدم (الصعوبة ⭐⭐⭐): أنشئ مصفوفة 12x8. قسمها إلى 3 أجزاء متساوية، ثم قسمها عند الفهارس [3, 7]. استخدم np.tile لتكرار نمط 2x2 في شبكة 8x8.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%