NumPy: الربط والتقسيم
آخر تحديث: 2026-08-26
الربط والتقسيم
1. ما ستتعلمه
- ❶ concatenate — الربط على طول محور
- ❷ vstack / hstack — دوال مساعدة
- ❸ stack — الربط ببعد جديد
- ❹ split / vsplit / hsplit — تقسيم المصفوفات
- ❺ repeat / tile — التكرار والتوسيع
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 الذي يتحكم في الاتجاه.
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]]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(2) vstack و hstack
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)
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(3) stack — الربط ببعد جديد
stack ينشئ محورًا جديدًا ويربط على طوله:
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]]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(4) split — تقسيم المصفوفات
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) # تقسيم الأعمدة
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(5) repeat و tile
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)
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
: الربط مقابل التجميع (الصعوبة ⭐)
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]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
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 للتقسيم غير المتساوي (الصعوبة ⭐⭐)
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 📖 للعرض فقط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 لتوسيع البيانات (الصعوبة ⭐)
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)
المخرجات:
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يربط على طول محور موجود؛ يجب أن تتطابق المحاور باستثناء محور الربطvstack/hstackهي اختصارات لربط المحور 0 والمحور 1stackينشئ بُعدًا جديدًا، مفيد لبناء دفعات من البياناتsplit/vsplit/hsplitتقسم المصفوفات إلى أجزاء متساوية أو عند فهارس محددةrepeatيكرر العناصر؛tileيكرر المصفوفة بأكملها
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ مصفوفتين 3x4 من أرقام عشوائية. اربطهما على طول المحور 0، ثم على طول المحور 1. اطبع أشكال النتائج.
-
متوسط (الصعوبة ⭐⭐): أنشئ ثلاث مصفوفات أحادية البعد بطول 5. استخدم
stackلدمجها في مصفوفة 3x5. ثم استخدمvstackوقارن الأشكال. -
متقدم (الصعوبة ⭐⭐⭐): أنشئ مصفوفة 12x8. قسمها إلى 3 أجزاء متساوية، ثم قسمها عند الفهارس [3, 7]. استخدم
np.tileلتكرار نمط 2x2 في شبكة 8x8.