NumPy: العمليات على العناصر
آخر تحديث: 2026-08-26
1. ما ستتعلمه
- ❶ العمليات الحسابية —
+ - * / // % **والدوال المقابلة لها - ❷ المقارنة —
> < >= <= == !=لتوليد الأقنعة المنطقية - ❸ العمليات المنطقية —
& | ^ ~وnp.logical_andوغيرها - ❹ المتجهة مقابل الحلقات — مقارنة الأداء والمبادئ
- ❺ مقدمة عن ufunc — مفهوم وخصائص الدوال العامة
2. قصة
يستخدم بوب حلقة for لتربيع مليون رقم — يستغرق 0.3 ثانية. أليس تكتب سطراً واحداً a ** 2 — 3 ملي ثانية.
"عمليات NumPy الحسابية ليست حلقة Python. إنها عملية ufunc دفعية على مستوى C، أسرع بـ 100 مرة."
يسأل بوب: "ما هو ufunc؟" تفتح أليس محطتها وتكتب np.add — كل شيء يبدأ بالعمليات على العناصر.
3. المفاهيم الأساسية
(1) العوامل الحسابية والدوال
تعمل عمليات NumPy الحسابية على كل عنصر من المصفوفة، مع بث الأشكال تلقائياً:
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
print(a + b) # [11 22 33 44]
print(a * b) # [10 40 90 160]
print(a ** 2) # [ 1 4 9 16]
print(b // a) # [10 10 10 10]
print(b % a) # [0 0 0 0]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
كل عامل يقابل دالة NumPy:
| العامل | الدالة | الوصف |
|---|---|---|
+ |
np.add |
الجمع |
- |
np.subtract |
الطرح |
* |
np.multiply |
الضرب |
/ |
np.true_divide |
القسمة الحقيقية |
// |
np.floor_divide |
قسمة الأرضية |
% |
np.mod |
باقي القسمة |
** |
np.power |
الأس |
(2) عمليات المقارنة
المقارنات تتم على كل عنصر، وتُعيد مصفوفات منطقية (أقنعة):
a = np.array([3, 7, 1, 9, 5])
print(a > 4) # [False True False True True]
print(a == 7) # [False True False False False]
print((a >= 3) & (a <= 7)) # [ True True False False True]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(3) العمليات المنطقية
استخدم العوامل على مستوى البت & | ^ ~ (وليس and or not) للدمج المنطقي على مستوى العناصر:
a = np.array([True, True, False, False])
b = np.array([True, False, True, False])
print(a & b) # [ True False False False]
print(a | b) # [ True True True False]
print(~a) # [False False True True]
print(np.logical_and(a, b)) # [ True False False False]
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(4) مفهوم ufunc
ufunc (الدالة العامة) هي التجريد منخفض المستوى في NumPy للعمليات على العناصر:
- كل ufunc هو حلقة على مستوى C تطبق نفس العملية على كل عنصر
- يدعم البث، وترقية الأنواع، والتخزين المؤقت للمخرجات
- له خصائص
.typesو.ninو.nout
print(np.add.nin) # 2 (عدد المدخلات)
print(np.add.nout) # 1 (عدد المخرجات)
print(np.add.types) # قائمة تواقيع الأنواع المدعومة
> **المخرجات:** قم بتشغيل 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([2, 4, 6, 8])
b = np.array([1, 3, 5, 7])
print("a + b =", a + b) # [ 3 7 11 15]
print("a - b =", a - b) # [1 1 1 1]
print("a * b =", a * b) # [ 2 12 30 56]
print("a / b =", a / b) # [2. 1.33 1.2 1.14]
print("a // b =", a // b) # [2 1 1 1]
print("a % b =", a % b) # [0 1 1 1]
print("a ** 3 =", a ** 3) # [ 8 64 216 512]
> **المخرجات:** قم بتشغيل 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
scores = np.array([55, 82, 91, 47, 73, 100])
pass_mask = scores >= 60
print("Pass mask:", pass_mask)
print("Pass scores:", scores[pass_mask])
excellent = scores >= 90
print("Excellent:", scores[excellent])
mid_range = (scores >= 60) & (scores < 90)
print("Mid-range:", scores[mid_range])
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (`pip install numpy`) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال: استخدام معامل out في ufunc (الصعوبة ⭐⭐)
import numpy as np
a = np.array([10, 20, 30, 40])
b = np.array([3, 4, 5, 6])
# الجمع في المكان باستخدام معامل out
result = np.empty(4)
np.add(a, b, out=result)
print("Result:", result)
---
## 4. تسلسل العمليات باستخدام out
np.multiply(result, 2, out=result)
print("Doubled:", result)
---
## 5. ufunc للمقارنة
print("a > 15:", np.greater(a, 15))
المخرجات:
Result:
Doubled:
a > 15:
المخرجات:
TEXT 📖 للعرض فقطResult: [13 24 35 46] Doubled: [26 48 70 92] a > 15: [False True True True]
❓ أسئلة شائعة
np.add بدلاً من +؟+ يستدعي np.add داخلياً. استخدم صيغة الدالة عندما تحتاج معاملات إضافية مثل dtype أو out أو where، أو عند تمرير ufunc كاستدعاء.inf أو -inf، و 0/0 تُنتج nan، مع تحذير اختياري بناءً على np.seterr. القسمة على صفر للأعداد الصحيحة تسبب ZeroDivisionError.📖 ملخص
- العوامل الحسابية
+ - * / // % **تعمل على كل عنصر، لكل منها دالةnp.xxxمقابلة - عوامل المقارنة تُنشئ أقنعة منطقية للتصفية الشرطية
- العمليات المنطقية تستخدم
& | ^ ~وليسand or not؛ دوالnp.logical_*تعمل أيضاً - المتجهة أسرع بـ 50-200 مرة من حلقات Python، مدعومة بـ ufuncs على مستوى C
- ufuncs هي محرك NumPy للعمليات على العناصر، تدعم البث وترقية الأنواع
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ
x = np.linspace(-5, 5, 100). احسب دالة السيجمويد1 / (1 + np.exp(-x))باستخدام المتجهة. احسب عدد النتائج الأكبر من 0.5. -
متوسط (الصعوبة ⭐⭐): احسب
np.sin(x)لمليون رقم عشوائي باستخدام حلقة for والمتجهة. قارن الزمن واحسب عامل التسريع. -
متقدم (الصعوبة ⭐⭐⭐): نفذ دالة ReLU مُتجهة
max(0, x)لـx = np.linspace(-3, 3, 20). نفذها باستخدام قناع منطقيx * (x > 0)وnp.maximum(0, x).