ورقة NumPy المرجعية
آخر تحديث
إنشاء المصفوفات
المصفوفة تحمل قيمًا من نوع واحد في شبكة بأي عدد من الأبعاد.
| المهمة | الكود |
|---|---|
| استيراد NumPy | import numpy as np |
| من قائمة | np.array([1, 2, 3]) |
| مصفوفة ثنائية الأبعاد من قوائم متداخلة | np.array([[1, 2, 3], [4, 5, 6]]) |
| أصفار، آحاد، قيمة تعبئة واحدة | np.zeros((2, 3)), np.ones(4), np.full((2, 2), 7) |
| نطاق بخطوة (دون النهاية) | np.arange(0, 10, 2) # [0 2 4 6 8] |
| n نقطة متساوية التباعد (مع النهاية) | np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] |
| مصفوفة الوحدة | np.eye(3) |
| نفس شكل مصفوفة أخرى | np.zeros_like(m), np.ones_like(m) |
| اختيار نوع العناصر | np.array([1, 2, 3], dtype=np.float32) |
| شبكات الإحداثيات | xx, yy = np.meshgrid(np.arange(3), np.arange(2)) |
فحص مصفوفة
| المهمة | الكود |
|---|---|
| الشكل: حجم كل بُعد | m.shape # (3, 4) |
| عدد الأبعاد | m.ndim # 2 |
| عدد العناصر | m.size # 12 |
| نوع العناصر | m.dtype # int64 |
| تحويل النوع | m.astype(np.float64) |
| طول البُعد الأول | len(m) # 3 |
| العودة إلى قائمة Python | m.tolist() |
| طباعة منازل عشرية أقل | np.set_printoptions(precision=3, suppress=True) |
الفهرسة والتقطيع
الشرائح هي عروض (views): تتشارك الذاكرة مع المصفوفة الأصلية. أما الأقنعة وقوائم الفهارس فتُرجع نسخًا.
| المهمة | الكود |
|---|---|
| العنصر الأول والأخير | a[0], a[-1] |
| شريحة start:stop (دون stop) | a[1:4] # [20 30 40] |
| عنصر كل خطوتين، معكوسًا | a[::2], a[::-1] |
| عنصر واحد من مصفوفة ثنائية الأبعاد | m[1, 2] # 6 |
| صف، عمود | m[0], m[:, 1] |
| كتلة من الصفوف والأعمدة | m[:2, 1:3] |
| العناصر التي تحقق شرطًا | a[a > 25] # [30 40 50] |
| دمج الشروط | a[(a > 15) & (a < 45)] |
| الاختيار بقائمة مواضع | a[[0, 2, 4]] |
| المواضع التي تحقق الشرط | np.flatnonzero(a > 25) # [2 3 4] |
| الاختيار لكل عنصر | np.where(a > 25, a, 0) |
| النسخ قبل تعديل شريحة | part = a[1:3].copy() |
| تعيين القيم بقناع | a[a > 40] = 0 |
العمليات الحسابية والبث (broadcasting)
تعمل العوامل عنصرًا بعنصر. والبث يمدّ القيمة المفردة أو الصف أو العمود لتطابق شكل المصفوفة الأخرى.
| المهمة | الكود |
|---|---|
| عمليات حسابية عنصرًا بعنصر | x + y, x - y, x * y, x / y, x ** 2 |
| مع قيمة مفردة | x * 10 |
| الجذر التربيعي، الأُس، اللوغاريتم | np.sqrt(x), np.exp(x), np.log(x) |
| القيمة المطلقة، التقريب | np.abs(x - 5), np.round(x / 3, 2) |
| حصر القيم في نطاق | np.clip(x, 2, 8) |
| القيمة العظمى عنصرًا بعنصر | np.maximum(x, 3) |
| الضرب النقطي | x @ y # 37.0 |
| توسيط كل عمود (بث صف) | m - m.mean(axis=0) |
| تحجيم كل صف (بث عمود) | m / m.sum(axis=1, keepdims=True) |
| مقارنة الأعداد العشرية بأمان | np.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y) |
| الدوال المثلثية و pi | np.sin(np.pi / 2) # 1.0 |
التجميع على محور
يعمل axis=0 نزولًا عبر الصفوف ويعطي نتيجة واحدة لكل عمود. ويعمل axis=1 عرضًا عبر الأعمدة ويعطي نتيجة واحدة لكل صف.
| المهمة | الكود |
|---|---|
| مجموع كل العناصر | m.sum() # 21 |
| نتيجة واحدة لكل عمود | m.sum(axis=0) # [5 7 9] |
| نتيجة واحدة لكل صف | m.sum(axis=1) # [ 6 15] |
| المتوسط والانحراف المعياري | m.mean(), m.std(), m.mean(axis=0) |
| القيمة الدنيا، القيمة العظمى | m.min(), m.max(axis=1) |
| موضع القيمة العظمى | m.argmax(), m.argmax(axis=1) |
| الوسيط والمئينات | np.median(m), np.percentile(m, [25, 50, 75]) |
| مجموع تراكمي | np.cumsum(m, axis=1) |
| حاصل ضرب كل العناصر | m.prod() # 720 |
| any و all والعدّ | (m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2) |
إعادة التشكيل والدمج
إعادة التشكيل تحافظ على العناصر وتغيّر الشكل، لذا يجب أن يبقى الحجم الكلي كما هو.
| المهمة | الكود |
|---|---|
| شكل جديد | a.reshape(2, 3) |
| دع NumPy يحسب أحد الأبعاد | a.reshape(3, -1), a.reshape(-1, 1) |
| التسطيح إلى بُعد واحد | m.ravel(), m.flatten() |
| المنقول (Transpose) | m.T |
| إضافة بُعد | a[:, np.newaxis], np.expand_dims(a, axis=0) |
| حذف الأبعاد ذات الحجم 1 | np.squeeze(np.ones((1, 3, 1))) |
| الوصل على محور موجود | np.concatenate([a, a]) |
| تكديس صفوف أو أعمدة | np.vstack([m, m]), np.hstack([m, m]) |
| مصفوفات أحادية البعد كأعمدة | np.column_stack([a, a ** 2]) |
| التكديس على محور جديد | np.stack([a, a], axis=0) # shape (2, 6) |
| التقسيم إلى أجزاء | np.split(a, 3), np.array_split(a, 4) |
| التكرار أو التبليط | np.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2] |
الترتيب والبحث والقيم الفريدة
| المهمة | الكود |
|---|---|
| نسخة مرتبة | np.sort(a) |
| الأكبر أولًا | np.sort(a)[::-1] |
| المواضع التي ترتّب المصفوفة | np.argsort(a) |
| أكبر ثلاث قيم | np.sort(a)[-3:] |
| القيم الفريدة وعدد تكرارها | values, counts = np.unique(a, return_counts=True) |
أسماء NumPy 2 (قد تكون unique_values غير مرتبة) | np.unique_values(a), np.unique_counts(a) |
| هل كل عنصر موجود في قائمة؟ | np.isin(a, [1, 9]) |
| موضع الإدراج في مصفوفة مرتبة | np.searchsorted([1, 3, 5, 7], 4) # 2 |
| عمليات المجموعات | np.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1]) |
| ترتيب الصفوف حسب عمود واحد | m[m[:, 1].argsort()] |
الأرقام العشوائية
أنشئ مولّد Generator واحدًا ببذرة ثابتة واسحب منه كل شيء، فتتكرر النتائج نفسها في كل تشغيل.
| المهمة | الكود |
|---|---|
| مولّد ببذرة | rng = np.random.default_rng(42) |
| أعداد عشرية في [0, 1) | rng.random(3) |
| أعداد صحيحة، دون الحد الأعلى | rng.integers(1, 7, size=10) |
| التوزيع الطبيعي | rng.normal(loc=0, scale=1, size=(2, 3)) |
| أعداد عشرية منتظمة في نطاق | rng.uniform(5, 10, size=4) |
| الاختيار من قائمة | rng.choice(["a", "b", "c"], size=5) |
| الاختيار دون تكرار | rng.choice(10, size=3, replace=False) |
| الاختيار بأوزان | rng.choice(["H", "T"], size=10, p=[0.7, 0.3]) |
| نسخة مخلوطة، خلط في المكان | rng.permutation(a), rng.shuffle(a) |
| أعداد ذات حدين و Poisson | rng.binomial(10, 0.5, size=5), rng.poisson(3, size=5) |
الجبر الخطي
| المهمة | الكود |
|---|---|
| ضرب المصفوفات | A @ A |
| حل Ax = b | np.linalg.solve(A, b) # [0.8 1.4] |
| المعكوس والمحدد | np.linalg.inv(A), np.linalg.det(A) |
| طول المتجه | np.linalg.norm(b) |
| القيم الذاتية والمتجهات الذاتية | values, vectors = np.linalg.eig(A) |
| ملاءمة خط مستقيم | slope, intercept = np.polyfit(x, y, 1) |
| الضرب الخارجي | np.outer([1, 2], [3, 4]) |
| القطر والأثر | np.diag(A), np.trace(A) |
القيم المفقودة والخاصة
تشير np.nan إلى عدد عشري مفقود. أي عملية حسابية معها تعطي nan ، لذا استخدم دوال nan أو قناعًا.
| المهمة | الكود |
|---|---|
| قيمة مفقودة | np.nan |
| إيجاد القيم المفقودة | np.isnan(v), np.isnan(v).sum() |
| حذف القيم المفقودة | v[~np.isnan(v)] |
| استبدال القيم المفقودة واللانهائية | np.nan_to_num(v, nan=0.0, posinf=0.0) |
| فحص اللانهاية والقيم المحدودة | np.inf, np.isfinite(v) |
| إحصاءات تتجاهل NaN | np.nanmean(v[:3]) # 2.0, np.nanmax(v) |
الحفظ والتحميل
| المهمة | الكود |
|---|---|
| مصفوفة واحدة، ملف ثنائي | np.save("data.npy", m), m = np.load("data.npy") |
| عدة مصفوفات في ملف واحد | np.savez("data.npz", x=x, y=y), np.load("data.npz")["x"] |
| كتابة نص CSV | np.savetxt("data.csv", m, delimiter=",", fmt="%d") |
| قراءة نص CSV | np.loadtxt("data.csv", delimiter=",") |
NumPy 2: الأسماء القديمة وما تكتبه الآن
حذف NumPy 2 كثيرًا من الأسماء البديلة، لذا قد يفشل الكود المنسوخ من الدروس القديمة بخطأ AttributeError .
| المهمة | NumPy 2 | الصيغة القديمة |
|---|---|---|
| قيمة مفقودة | np.nan | np.NaN |
| اللانهاية | np.inf | np.Inf |
| نوع عشري 64 بت | np.float64 | np.float_ |
| المساحة تحت منحنى | np.trapezoid(y, x) | np.trapz(y, x) |
| هل كل عنصر موجود في مصفوفة أخرى؟ | np.isin(a, b) | np.in1d(a, b) |
| تكديس الصفوف | np.vstack([a, a]) | np.row_stack([a, a]) |
| حاصل الضرب | np.prod(a) | np.product(a) |
| الأرقام العشوائية | rng = np.random.default_rng(0)
rng.random(3) | np.random.seed(0)
np.random.rand(3) |
استدعاءات NumPy التي يقوم عليها كود علم البيانات، مرتبة حسب المهمة: إنشاء المصفوفات، فحصها، الفهرسة والتقطيع، العمليات الحسابية عنصرًا بعنصر، التجميع على محور، إعادة التشكيل والدمج، الترتيب والبحث، توليد الأرقام العشوائية، وحل مسائل الجبر الخطي. كل صف مقتطف قصير يمكنك لصقه مباشرة، مع سطر واحد يشرح ما يفعله.
كل ما هنا مكتوب لإصدار NumPy 2، وهو الإصدار الذي يشغّله Coddy، ويعرض الجدول الأخير الأسماء التي حذفها NumPy 2 بجانب ما تكتبه بدلًا منها. تستخدم معظم الأمثلة a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) و m = np.arange(12).reshape(3, 4) . هل أنت جديد على Python نفسها؟ ابدأ بـ ورقة Python المرجعية و ساحة تجربة Python، واحتفظ بأوراق pandas و Matplotlib و scikit-learn المرجعية بجانب هذه الورقة.
الأسئلة الشائعة حول ورقة NumPy المرجعية
هل ورقة NumPy المرجعية هذه مجانية؟
ما إصدار NumPy الذي تغطيه هذه الورقة المرجعية؟
np.NaN و np.float_ و np.trapz و np.in1d ، لذا يعرض الجدول الأخير كلًا منها بجانب اسمه الحالي.ماذا يعني axis=0 في NumPy؟
axis=0 نزولًا عبر الصفوف، لذا يُرجع m.sum(axis=0) مجموعًا واحدًا لكل عمود. ويسير axis=1 عرضًا عبر الأعمدة ويُرجع مجموعًا واحدًا لكل صف. وبدون تحديد محور تستخدم الدالة كل العناصر.ما الفرق بين العرض (view) والنسخة (copy)؟
a[1:3] عرض: تتشارك الذاكرة مع a ، لذا فتعديل الشريحة يعدّل a . أما الأقنعة المنطقية وقوائم الفهارس مثل a[a > 2] أو a[[0, 2]] فتُرجع نسخًا. استدعِ .copy() عندما تحتاج إلى مصفوفة مستقلة.لماذا أستخدم مصفوفة NumPy بدلًا من قائمة Python؟
a * 2 يضاعف كل عنصر، بينما [1, 2] * 2 يكرر القائمة. وتقوم pandas و scikit-learn على مصفوفات NumPy.هل أستخدم np.random.seed أم default_rng؟
rng = np.random.default_rng(seed) واستدعِ الدوال على rng ، مثل rng.normal() أو rng.integers() . هذه هي الواجهة الموصى بها، بتدفقات عشوائية أفضل ودون حالة عامة مخفية. ما زالت np.random.seed و np.random.rand تعملان، لكنهما الواجهة القديمة.