NumPy هي المكتبة التي كل مكتبات الذكاء الاصطناعي تقريبًا مبنية عليها: Pandas، scikit-learn، PyTorch، TensorFlow. هذه الصفحة تشرح أساسيات NumPy التي تحتاجها فعليًا — ليس كل التفاصيل الأكاديمية، فقط ما تستعمله في مشاريعك.
ما هي NumPy؟
NumPy تقدّم نوع بيانات واحد أساسي: ndarray — مصفوفة متعددة الأبعاد من القيم العددية (عادةً أرقام، لكن ممكن نصوص أو قيم منطقية). ميزتها الأساسية عن قوائم Python: السرعة. العمليات على ملايين القيم تتم في أجزاء من الثانية بفضل تنفيذ C الداخلي.
التثبيت والاستيراد
بعد تجهيز بيئة Python للذكاء الاصطناعي:
pip install numpy
في Jupyter:
import numpy as np
print(np.__version__)
إنشاء مصفوفات
# من قائمة Python
a = np.array([1, 2, 3, 4, 5])
# من صفر أو واحد
zeros = np.zeros((3, 4)) # 3 صفوف × 4 أعمدة، كلها 0
ones = np.ones((2, 3)) # 2 × 3، كلها 1
# نطاقات
seq = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
lin = np.linspace(0, 1, 5) # 5 نقاط متساوية بين 0 و 1
# أرقام عشوائية
rng = np.random.default_rng(42)
random_floats = rng.random((2, 3)) # قيم بين 0 و 1
الشكل (Shape) والأبعاد
كل ndarray له شكل يصف أبعاده:
a = np.array([[1, 2, 3],
[4, 5, 6]])
print(a.shape) # (2, 3) — صفّان، 3 أعمدة
print(a.ndim) # 2 — بُعدان
print(a.dtype) # int64 — نوع البيانات
الفهرسة (Indexing) والتقطيع (Slicing)
a = np.array([10, 20, 30, 40, 50])
# عنصر واحد
print(a[0]) # 10
print(a[-1]) # 50
# شريحة
print(a[1:4]) # [20, 30, 40]
# مصفوفة ثنائية الأبعاد
m = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(m[0, 1]) # الصف 0، العمود 1 → 2
print(m[:, 0]) # كل الصفوف، العمود 0 → [1, 4, 7]
print(m[1, :]) # الصف 1 كله → [4, 5, 6]
العمليات الرياضية
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(a.mean()) # 2.5
print(a.std()) # الانحراف المعياري
print(a.max(), a.min()) # أكبر وأصغر قيمة
Broadcasting
قوة NumPy: عمليات بين مصفوفات بأشكال مختلفة بدون نسخ:
a = np.array([1, 2, 3])
b = 10
print(a + b) # [11, 12, 13] — العدد 10 "بُثّ" ليطابق شكل a
m = np.array([[1, 2, 3],
[4, 5, 6]])
row = np.array([10, 20, 30])
print(m + row) # الصف نفسه يُضاف لكل صف من المصفوفة
هذه الخاصية هي التي تجعل عمليات الذكاء الاصطناعي (مثل ضرب كل صف من البيانات بنفس الأوزان) سهلة وسريعة.
لماذا NumPy مهمة للذكاء الاصطناعي؟
- البيانات تتحول إلى NumPy arrays: عندما تقرأ صورة (224×224×3 بيكسل)، صوت (آلاف العينات)، أو جدول ميزات (آلاف الصفوف × عشرات الأعمدة) — كلها مصفوفات NumPy في النهاية.
- scikit-learn يتوقّع NumPy أو Pandas كدخل. التحوّل بين الاثنين سلس.
- PyTorch وTensorFlow يستخدمان مفاهيم مشابهة جدًا لـ NumPy (Tensor = ndarray متعدد الأبعاد).
- فهم NumPy يجعلك تفهم ما يحدث داخل النماذج، بدل أن تعاملها كصندوق أسود.
مثال عملي: تحضير ميزات لاختبار قادم
لنفترض أن لديك بيانات أسعار 5 منازل:
# كل صف = منزل، الأعمدة = [المساحة (م²), عدد الغرف, عمر المنزل (سنوات)]
houses = np.array([
[120, 3, 10],
[200, 4, 5],
[85, 2, 20],
[300, 5, 2],
[150, 3, 15],
])
# طباعة متوسط المساحة
print("متوسط المساحة:", houses[:, 0].mean()) # 171.0
# أكبر عدد غرف
print("أكبر عدد غرف:", houses[:, 1].max()) # 5
# تطبيع (normalization) — تحويل كل عمود لمتوسط 0 وانحراف معياري 1
features = houses[:, :2] # المساحة والغرف
mean = features.mean(axis=0)
std = features.std(axis=0)
normalized = (features - mean) / std
print(normalized)
هذا التطبيع خطوة معتادة قبل تدريب النماذج، وستلاحظ أن scikit-learn تقدّم نفس الشيء في StandardScaler.
أخطاء شائعة
- تعديل ndarray يفاجئك: NumPy أحيانًا تعيد "عرض" (View) بدل نسخة، فتعديل الشريحة يعدّل الأصل. استخدم
.copy()إذا أردت نسخة مستقلة. - خلط أنواع البيانات:
np.array([1, 2, 3.0])يصبح كلهfloat64. حدد النوع يدويًا إن أردت (dtype=np.int32). - مقارنة ndarray بقائمة Python:
np.array([1,2,3]) == [1,2,3]يُرجع مصفوفة Bool، لا قيمة منطقية واحدة.
الخطوات التالية
- Pandas لتحضير البيانات — الجداول والبيانات الحقيقية.
- Jupyter Notebook للمبتدئين — كيف تشغّل هذه الأمثلة.
- تمرين: تحميل CSV في Jupyter — تطبيق يجمع NumPy + Pandas + Jupyter.
📚 مرجع إضافي: توثيق NumPy الرسمي.