NumPy: الفهرسة والتقطيع

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

1. ما ستتعلمه




2. قصة

تشارلي يحلل مصفوفة بيانات حساسات تحتوي على 10K صف. يستخدم data[0:3] لأخذ أول 3 صفوف لتنظيف القيم الشاذة، ويضبط القيم المفقودة إلى -1:

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

بعد التنظيف، subset تبدو رائعة. لكن عندما يتحقق من data الأصلية، تم تعديل أول 3 صفوف أيضًا!

"الشرائح تعيد عروضًا، وليست نسخًا!" تشرح أليس.

تظهر أليس لتشارلي كيفية استخدام subset = data[0:3].copy() للعمليات الآمنة التي لا تؤثر على الأصل. يتعلم تشارلي بالطريقة الصعبة: شرائح NumPy تشارك الذاكرة افتراضيًا — هذا مصدر كفاءتها وجذر أفخاخها.




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

(1) الفهرسة الأساسية

فهرسة المصفوفات 1D تعمل مثل قوائم Python: تبدأ من 0، الفهارس السالبة تعد من -1.

PYTHON
import numpy as np

a = np.array([10, 20, 30, 40, 50])
a[0]    # 10
a[-1]   # 50
a[2]    # 30
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.

(2) صيغة التقطيع

صيغة الشريحة: start:stop:step. الأجزاء الثلاثة اختيارية:

الصيغة المختصرة المكافئ المعنى
a[:] a[0:len(a):1] جميع العناصر
a[2:] a[2:len(a):1] من الفهرس 2 إلى النهاية
a[:3] a[0:3:1] أول 3 عناصر
a[::2] a[0:len(a):2] كل عنصر آخر
a[::-1] a[len(a)-1::-1] عكس المصفوفة
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.

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

(3) الفهرسة 2D

PYTHON
import numpy as np

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
---
##  4. [ 4  5  6  7]
---
##  5. [ 8  9 10 11]]

---
## 6. الصف والعمود
print(a[1])       # [4 5 6 7] — الصف 1
print(a[1, 2])    # 6 — الصف 1، العمود 2

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

(4) حدس الفهرسة 3D

فكر في المصفوفة ثلاثية الأبعاد كـ "طبقات من مصفوفات ثنائية الأبعاد":

PYTHON
import numpy as np

a = np.arange(24).reshape(2, 3, 4)
print(a.shape)  # (2, 3, 4)

---
## 10. الطبقة 0: أول مصفوفة 3x4
print(a[0])
---
## 11. [[ 0  1  2  3]
---
##  12. [ 4  5  6  7]
---
##  13. [ 8  9 10 11]]

---
## 14. الطبقة 1: ثاني مصفوفة 3x4
print(a[1])
---
## 15. [[12 13 14 15]
---
##  16. [16 17 18 19]
---
##  17. [20 21 22 23]]

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

(5) العروض مقابل النسخ

الشرائح تعيد عروضًا دائمًا. تعديل الشريحة يعدل المصفوفة الأصلية.

PYTHON
import numpy as np

a = np.arange(12).reshape(3, 4)
view = a[0:2, 1:3]
view[0, 0] = 999

print(a)
---
## 19. [[  0 999   2   3]
---
##  20. [  4   5   6   7]
---
##  21. [  8   9  10  11]]
---
## 22. الأصل تغير!

---
## 23. استخدم .copy() للحصول على نسخة آمنة
copy = a[0:2, 1:3].copy()
copy[0, 0] = 0
print(a[0, 1])  # 999 — الأصل لم يتغير بالنسخة
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 والبذرة العشوائية.

: تقطيع 1D بالخطوة (الصعوبة ⭐)

PYTHON
import numpy as np

a = np.arange(10)

print("Original:", a)
---
## 24. [0 1 2 3 4 5 6 7 8 9]

print("a[2:8:2]:", a[2:8:2])  # [2 4 6]
print("a[::-1]:", a[::-1])    # [9 8 7 6 5 4 3 2 1 0]
print("a[5:1:-1]:", a[5:1:-1])  # [5 4 3 2]
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 والبذرة العشوائية.

: استخراج مصفوفة فرعية 2D (الصعوبة ⭐⭐)

PYTHON
import numpy as np

a = np.arange(20).reshape(4, 5)
print("Original:\n", a)

---
## 25. استخراج الصفوف 1-2، الأعمدة 2-4
sub = a[1:3, 2:5]
print("a[1:3, 2:5]:\n", sub)
---
## 26. [[ 7  8  9]
---
##  27. [12 13 14]]

---
## 28. كل صف آخر، كل عمود آخر
print("a[::2, ::2]:\n", a[::2, ::2])
---
## 29. [[ 0  2  4]
---
##  30. [10 12 14]]
TEXT 📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
⚠️ ملاحظة: الكود أدناه يحتاج إلى التشغيل في بيئة Python محلية.




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

(1) أنواع الشرائح

الشريحة المعنى النتيجة لـ [0,1,2,3,4,5]
[:] الكل [0 1 2 3 4 5]
[2:] من الفهرس 2 [2 3 4 5]
[:3] أول 3 [0 1 2]
[1:4] الفهرس 1 إلى 3 [1 2 3]
[::2] كل عنصر آخر [0 2 4]
[::-1] معكوسة [5 4 3 2 1 0]

(2) عرض مقابل نسخة

الميزة شريحة (عرض) فهرسة متقدمة (نسخة)
الصيغة a[1:3] a[[1, 2, 3]]
الإرجاع عرض نسخة
الذاكرة مشتركة تخصيص جديد
التعديل يؤثر على الأصل نعم لا
السرعة O(1) O(n)

▶ مثال: استخدام علامات الحذف للتقطيع متعدد الأبعاد (الصعوبة ⭐⭐)

PYTHON
import numpy as np

arr = np.arange(24).reshape(2, 3, 4)
print("Shape:", arr.shape)

---
## 32. علامات الحذف (...) تعني "جميع الأبعاد المتبقية"
print("arr[0, ...]:\n", arr[0, ...])
print("arr[..., 0]:\n", arr[..., 0])

---
## 33. تحديد العمود الأخير لجميع الطبقات والصفوف
print("arr[..., -1]:\n", arr[..., -1])

المخرجات:

TEXT 📖 للعرض فقط
Shape:
arr[0, ...]:\n
arr[..., 0]:\n
arr[..., -1]:\n

المخرجات:

TEXT 📖 للعرض فقط
Shape: (2, 3, 4)
arr[0, ...]:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
arr[..., 0]:
 [[ 0  4  8]
 [12 16 20]]
arr[..., -1]:
 [[ 3  7 11]
 [15 19 23]]



❓ أسئلة شائعة

س كيف أحصل على نسخة بدلاً من عرض؟
ج استخدم .copy() صراحة: a[1:3].copy(). أو استخدم الفهرسة المتقدمة مثل a[[0, 1, 2]] التي تعيد دائمًا نسخة.
س ما هي علامات الحذف (...) في الفهرسة؟
ج ... (Ellipsis) تعني "جميع الأبعاد المتبقية." a[..., 0] تعني "تحديد الفهرس 0 من البعد الأخير لجميع الأبعاد الأخرى." مفيد للمصفوفات عالية الأبعاد.
س هل يمكنني التعيين لشريحة؟
ج نعم! a[1:3] = [99, 100] يستبدل العنصرين 1 و 2. هذه ميزة قوية — يمكنك تعديل أجزاء من المصفوفة في مكانها.
س لماذا a[::-1] يعكس المصفوفة؟
ج لأن step=-1 تعني "ابدأ من النهاية واذهب للخلف." إنها عرض، وليست نسخة — لذا العكس هو O(1) ولا يخصص ذاكرة جديدة.

📖 ملخص



📝 تمارين

  1. مبتدئ (الصعوبة ⭐): أنشئ a = np.arange(15). استخرج: (أ) أول 5 عناصر، (ب) آخر 3 عناصر، (ج) العناصر في الفهارس الزوجية، (د) المصفوفة بترتيب عكسي.

  2. متوسط (الصعوبة ⭐⭐): أنشئ مصفوفة 5x5 من 0..24. استخرج: (أ) المصفوفة الفرعية المركزية 3x3، (ب) أول وآخر صف، (ج) جميع الصفوف الزوجية والأعمدة الفردية. تحقق من أن تعديل المصفوفة الفرعية يغير الأصل.

  3. متقدم (الصعوبة ⭐⭐⭐): أنشئ مصفوفة 3x4x5. استخدم ... لتحديد العمود الأخير من جميع الطبقات والصفوف. ثم استخدم a[0, ...] لتحديد الطبقة الأولى. اشرح ما يفعله ... في كل حالة.

Web-Tutorial.com

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

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

100%