NumPy: الفرز والبحث
آخر تحديث: 2026-08-26
1. ما ستتعلمه
- ❶
np.sort— فرز المصفوفات على طول أي محور - ❷
np.argsort— الحصول على الفهارس التي سترتب - ❸
np.searchsorted— إيجاد مواضع الإدراج في المصفوفات المرتبة - ❹
np.unique— إيجاد العناصر الفريدة - ❺
np.partition— الفرز الجزئي لأفضل k
2. المفاهيم الأساسية
(1) الفرز
PYTHON
import numpy as np
a = np.array([3, 1, 4, 1, 5, 9, 2, 6])
print(np.sort(a)) # [1 1 2 3 4 5 6 9]
print(np.argsort(a)) # [1 3 0 6 2 4 7 5] (الفهارس)
# فرز ثنائي الأبعاد
b = np.array([[3, 1, 4],
[1, 5, 9]])
print(np.sort(b, axis=0)) # فرز كل عمود
print(np.sort(b, axis=1)) # فرز كل صف
TEXT
📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(2) البحث
PYTHON
import numpy as np
a = np.array([1, 3, 5, 7, 9])
---
## 3. إيجاد مواضع الإدراج (يجب أن تكون المصفوفة مرتبة)
print(np.searchsorted(a, 4)) # 2 (أدخل بين 3 و 5)
print(np.searchsorted(a, [2, 6, 8])) # [1 3 4]
---
## 4. إيجاد الفهارس حيث الشرط محقق
print(np.where(a > 4)) # (array([2, 3, 4]),)
TEXT
📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(3) العناصر الفريدة
PYTHON
a = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3])
print(np.unique(a)) # [1 2 3 4 5 6 9]
---
## 5. مع الأعداد
vals, counts = np.unique(a, return_counts=True)
print(vals) # [1 2 3 4 5 6 9]
print(counts) # [2 1 2 1 2 1 1]
TEXT
📖 للعرض فقط
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال: فرز المصفوفات (الصعوبة ⭐)
PYTHON
import numpy as np
a = np.array([3, 1, 4, 1, 5, 9, 2, 6])
---
## 6. الفرز يُرجع نسخة مرتبة
sorted_a = np.sort(a)
print("Original:", a)
print("Sorted:", sorted_a)
---
## 7. فرز في المكان
a.sort()
print("In-place:", a)
---
## 8. فرز ثنائي الأبعاد على طول المحور
b = np.array([[3, 1, 4], [1, 5, 9]])
print("Sort columns:
", np.sort(b, axis=0))
print("Sort rows:
", np.sort(b, axis=1))
المخرجات:
TEXT
📖 للعرض فقط
Original:
Sorted:
In-place:
المخرجات:
TEXT 📖 للعرض فقطOriginal: [3 1 4 1 5 9 2 6] Sorted: [1 1 2 3 4 5 6 9] In-place: [1 1 2 3 4 5 6 9] Sort columns: [[1 1 4] [3 5 9]] Sort rows: [[1 3 4] [1 5 9]]
▶ مثال: استخدام argsort (الصعوبة ⭐⭐)
PYTHON
import numpy as np
scores = np.array([85, 92, 78, 95, 88])
names = np.array(['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'])
---
## 9. الحصول على الفهارس التي سترتب الدرجات
idx = np.argsort(scores)
print("Indices:", idx)
print("Sorted scores:", scores[idx])
---
## 10. ترتيب الأسماء حسب درجاتهم (تنازلياً)
desc_idx = np.argsort(-scores)
print("Ranking:")
for rank, i in enumerate(desc_idx, 1):
print(f" {rank}. {names[i]}: {scores[i]}")
المخرجات:
TEXT
📖 للعرض فقط
Indices:
Sorted scores:
Ranking:
المخرجات:
TEXT 📖 للعرض فقطIndices: [2 0 4 1 3] Sorted scores: [78 85 88 92 95] Ranking: 1. Diana: 95 2. Bob: 92 3. Eve: 88 4. Alice: 85 5. Charlie: 78
▶ مثال: إيجاد القيم الفريدة مع الأعداد (الصعوبة ⭐)
PYTHON
import numpy as np
grades = np.array(['A', 'B', 'A', 'C', 'B', 'A', 'B', 'B', 'C', 'A'])
unique, counts = np.unique(grades, return_counts=True)
print("Grades:", unique)
print("Counts:", counts)
---
## 11. إيجاد مكان إدراج القيم في مصفوفة مرتبة
sorted_arr = np.array([1, 3, 5, 7, 9])
pos = np.searchsorted(sorted_arr, [2, 4, 6, 8])
print("Insertion positions:", pos)
المخرجات:
TEXT
📖 للعرض فقط
Grades:
Counts:
Insertion positions:
المخرجات:
TEXT 📖 للعرض فقطGrades: ['A' 'B' 'C'] Counts: [4 4 2] Insertion positions: [1 2 3 4]
س هل
np.sort يُعدّل المصفوفة الأصلية؟ج لا — يُرجع نسخة مرتبة. استخدم
a.sort() (طريقة في المكان) لفرز المصفوفة الأصلية دون إنشاء نسخة.س ما الفرق بين
np.sort و np.argsort؟ج
np.sort يُرجع القيم المرتبة. np.argsort يُرجع الفهارس التي ستنتج المصفوفة المرتبة. استخدم argsort عندما تحتاج إلى ترتيب مصفوفات متعددة بنفس الترتيب.س ما هو
np.partition؟ج يُرتب المصفوفة جزئياً بحيث يكون العنصر k-th الأصغر في موضعه النهائي، مع العناصر الأصغر قبله والعناصر الأكبر بعده (بترتيب عشوائي). أسرع من الفرز الكامل لاستعلامات top-k.
❓ أسئلة شائعة
س ما هو أهم شيء يجب تذكره؟
ج عمليات NumPy مُتجهة — تجنب حلقات Python للحصول على أداء أفضل.
س أين يمكنني معرفة المزيد؟
ج تحقق من وثائق NumPy الرسمية على numpy.org للمراجع التفصيلية والمواضيع المتقدمة.
س هل هذا يعمل مع NumPy 2.x؟
ج نعم — جميع الأمثلة متوافقة مع NumPy 2.x. بعض واجهات API القديمة (مثل np.random.seed) لا تزال مدعومة لكن البدائل الحديثة موصى بها.
📖 ملخص
np.sort: يُرجع نسخة مرتبة؛a.sort()يُرتب في المكانnp.argsort: يُرجع فهارس الترتيب؛ مفيد لترتيب مصفوفات متعددة بنفس الترتيبnp.searchsorted: يجد مواضع الإدراج في المصفوفات المرتبة (بحث ثنائي، O(log n))np.unique: يجد العناصر الفريدة مع أعداد اختيارية وفهارس ومعكوسnp.partition: فرز جزئي — أسرع من الفرز الكامل لإيجاد عناصر top-k
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ مصفوفة من 20 عدداً صحيحاً عشوائياً 0-99. رتبها، ابحث عن الفهارس التي سترتبها، وابحث عن القيم الفريدة.
-
متوسط (الصعوبة ⭐⭐): أنشئ مصفوفتين — أسماء ودرجات. استخدم
np.argsortعلى الدرجات لترتيب كلتا المصفوفتين بحيث يأتي الاسم الحاصل على أعلى درجة أولاً. -
متقدم (الصعوبة ⭐⭐⭐): استخدم
np.searchsortedلدمج مصفوفتين مرتبتين في مصفوفة واحدة مرتبة دون استدعاءnp.sort. تحقق من أن النتيجة مرتبة بشكل صحيح.