NumPy: الفهرسة والتقطيع
آخر تحديث: 2026-08-26
1. ما ستتعلمه
- ❶ الفهرسة والتقطيع 1D: الوصول بالرمز المنخفض واستخراج النطاق من مصفوفات 1D
- ❷ الفهرسة 2D: استخراج الصفوف والأعمدة والمصفوفات الفرعية
- ❸ حدس الفهرسة 3D: التفكير في طبقات للمصفوفات عالية الأبعاد
- ❹ التقطيع بالخطوة: الخطوات الموجبة والسالبة والفهارس السالبة
- ❺ الشرائح هي عروض: فهم الفرق الأساسي بين العروض والنسخ
2. قصة
تشارلي يحلل مصفوفة بيانات حساسات تحتوي على 10K صف. يستخدم data[0:3] لأخذ أول 3 صفوف لتنظيف القيم الشاذة، ويضبط القيم المفقودة إلى -1:
subset = data[0:3]
subset[subset == -999] = -1
> **المخرجات:** قم بتشغيل 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.
import numpy as np
a = np.array([10, 20, 30, 40, 50])
a[0] # 10
a[-1] # 50
a[2] # 30
> **المخرجات:** قم بتشغيل 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] |
عكس المصفوفة |
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]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(3) الفهرسة 2D
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]]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(4) حدس الفهرسة 3D
فكر في المصفوفة ثلاثية الأبعاد كـ "طبقات من مصفوفات ثنائية الأبعاد":
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
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(5) العروض مقابل النسخ
الشرائح تعيد عروضًا دائمًا. تعديل الشريحة يعدل المصفوفة الأصلية.
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 — الأصل لم يتغير بالنسخة
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
: تقطيع 1D بالخطوة (الصعوبة ⭐)
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]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
: استخراج مصفوفة فرعية 2D (الصعوبة ⭐⭐)
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]]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبتًا مسبقًا — قم بتثبيته محليًا (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
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) |
▶ مثال: استخدام علامات الحذف للتقطيع متعدد الأبعاد (الصعوبة ⭐⭐)
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])
المخرجات:
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[i]يصل إلى العنصر i؛ الفهارس السالبة تعد من النهاية - صيغة الشريحة:
start:stop:step— جميع الأجزاء اختيارية، الخطوة السالبة تعكس الاتجاه - الفهرسة 2D:
a[row, col]— اخلط الشرائح والأعداد الصحيحة بحرية - الفهرسة 3D+: فكر في طبقات؛
a[layer, row, col]للأبعاد 3D - الشرائح تعيد عروضًا — تعديلها يغير المصفوفة الأصلية
- استخدم
.copy()للحصول على نسخة آمنة ومستقلة
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ
a = np.arange(15). استخرج: (أ) أول 5 عناصر، (ب) آخر 3 عناصر، (ج) العناصر في الفهارس الزوجية، (د) المصفوفة بترتيب عكسي. -
متوسط (الصعوبة ⭐⭐): أنشئ مصفوفة 5x5 من 0..24. استخرج: (أ) المصفوفة الفرعية المركزية 3x3، (ب) أول وآخر صف، (ج) جميع الصفوف الزوجية والأعمدة الفردية. تحقق من أن تعديل المصفوفة الفرعية يغير الأصل.
-
متقدم (الصعوبة ⭐⭐⭐): أنشئ مصفوفة 3x4x5. استخدم
...لتحديد العمود الأخير من جميع الطبقات والصفوف. ثم استخدمa[0, ...]لتحديد الطبقة الأولى. اشرح ما يفعله...في كل حالة.