NumPy: الجبر الخطي
آخر تحديث: 2026-10-11
1. ما ستتعلمه
- ❶ ضرب المصفوفات: @، np.dot، np.matmul
- ❷ المعكوس والمحدد: np.linalg.inv، np.linalg.det
- ❸ القيم الذاتية والمتجهات الذاتية: np.linalg.eig
- ❹ حل الأنظمة الخطية: np.linalg.solve
- ❺ تفكيك المصفوفات: QR، SVD، Cholesky
2. قصة
يحتاج بوب إلى حل نظام من 1000 معادلة خطية. يكتب حلقة حذف غاوسي — 30 ثانية وتنفيذ مليء بالأخطاء. أليس تستخدم np.linalg.solve(A, b) — 0.01 ثانية، نتيجة دقيقة. "الجبر الخطي في NumPy ليس أسرع فحسب — إنه يستدعي BLAS/LAPACK، نفس المكتبات التي يستخدمها MATLAB و R. مُختبرة لعدة عقود."
3. المفاهيم الأساسية
(1) ضرب المصفوفات
PYTHON
import numpy as np
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
# ثلاث طرق مكافئة:
print(A @ B) # [[19 22]
# [43 50]]
print(np.dot(A, B)) # نفس الشيء
print(np.matmul(A, B)) # نفس الشيء
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(2) المعكوس والمحدد
PYTHON
import numpy as np
A = np.array([[1, 2],
[3, 4]])
det = np.linalg.det(A) # -2.000
inv = np.linalg.inv(A) # [[-2. 1. ]
# [ 1.5 -0.5]]
print(A @ inv) # [[1. 0.]
# [0. 1.]] (محايدة)
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
(3) حل الأنظمة الخطية
PYTHON
# حل Ax = b
A = np.array([[3, 1],
[1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(A, b)
print(x) # [2. 3.]
print(A @ x) # [9. 8.] — تحقق
TEXT
> **المخرجات:** قم بتشغيل NumPy 2.x في بيئة Python المحلية لديك لرؤية مخرجات ndarray. خادم Piston لا يحتوي على NumPy مثبت مسبقاً — قم بتثبيته محلياً (pip install numpy) وقارن. قد تختلف القيم الفعلية حسب إصدار NumPy والبذرة العشوائية.
▶ مثال: ضرب المصفوفات (الصعوبة ⭐)
PYTHON
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8],
[9, 10],
[11, 12]])
# ضرب مصفوفات: (2x3) @ (3x2) = (2x2)
C = A @ B
print("A @ B:\n", C)
# الضرب النقطي للمتجهات
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print("dot(x, y):", np.dot(x, y))
المخرجات:
TEXTA @ B: [[ 58 64] [139 154]] dot(x, y): 32
▶ مثال: حل الأنظمة الخطية (الصعوبة ⭐⭐)
PYTHON
import numpy as np
# حل: 3x + y = 9, x + 2y = 8
A = np.array([[3, 1],
[1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(A, b)
print("Solution:", x)
# تحقق
print("A @ x =", A @ x)
print("b =", b)
المخرجات:
TEXTSolution: [2. 3.] A @ x = [9. 8.] b = [9. 8.]
▶ مثال: القيم الذاتية والمتجهات الذاتية (الصعوبة ⭐⭐)
PYTHON
import numpy as np
A = np.array([[4, -2],
[1, 1]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)
# تحقق: A @ v = λ * v
v = eigenvectors[:, 0]
lam = eigenvalues[0]
lhs = A @ v
rhs = lam * v
print("A @ v:", lhs)
print("λ * v:", rhs)
print("Match:", np.allclose(lhs, rhs))
المخرجات:
TEXTEigenvalues: [3. 2.] A @ v: [0.89442719 0.4472136 ] λ * v: [0.89442719 0.4472136 ] Match: True
س ما الفرق بين @ و np.dot و np.matmul؟
ج للمصفوفات ثنائية الأبعاد، هي متطابقة. للأبعاد الأعلى، @ و np.matmul يستخدمان البث (ضرب مصفوفات مكدسة)، بينما np.dot يستخدم مجموع-الضرب على آخر محور لكل منها.
س متى يجب استخدام solve مقابل inv؟
ج استخدم solve دائماً — إنه أسرع وأكثر استقراراً عددياً. حساب inv(A) @ b أبطأ وأقل دقة من solve(A, b).
س ماذا إذا كانت A مفردة؟
ج np.linalg.solve يثير LinAlgError: Singular matrix. استخدم np.linalg.lstsq لحلول المربعات الصغرى للأنظمة غير المحددة/فوق المحددة.
❓ أسئلة شائعة
س ما هو أهم شيء يجب تذكره؟
ج عمليات NumPy مُتجهة — تجنب حلقات Python للحصول على أداء أفضل.
س أين يمكنني معرفة المزيد؟
ج تحقق من وثائق NumPy الرسمية على numpy.org للمراجع التفصيلية والمواضيع المتقدمة.
س هل هذا يعمل مع NumPy 2.x؟
ج نعم — جميع الأمثلة متوافقة مع NumPy 2.x. بعض واجهات API القديمة (مثل np.random.seed) لا تزال مدعومة لكن البدائل الحديثة موصى بها.
📖 ملخص
- @ / np.matmul / np.dot: ضرب المصفوفات
- np.linalg.inv: معكوس المصفوفة؛ np.linalg.det: المحدد
- np.linalg.eig: القيم الذاتية والمتجهات الذاتية
- np.linalg.solve: حل الأنظمة الخطية
- np.linalg.qr، np.linalg.svd، np.linalg.cholesky: التفكيكات
- استخدم solve بدلاً من inv @ b للسرعة والاستقرار
📝 تمارين
-
مبتدئ (الصعوبة ⭐): أنشئ مصفوفتين 3x3 من أعداد صحيحة عشوائية. احسب حاصل ضربهما ومحددهما ومعكوسهما. تحقق من أن A @ inv(A) ≈ مصفوفة محايدة.
-
متوسط (الصعوبة ⭐⭐): حل النظام: 3x + y = 9، x + 2y = 8 باستخدام np.linalg.solve. تحقق من صحة الحل.
-
متقدم (الصعوبة ⭐⭐⭐): ولّد مصفوفة عشوائية 5x5، احسب قيمها الذاتية ومتجهاتها الذاتية. تحقق من أن A @ v = λ * v لكل زوج ذاتي.