Menu
CoddyTech
flag Ar iconالعربيةdown icon

ورقة NumPy المرجعية

آخر تحديث

إنشاء المصفوفات

المصفوفة تحمل قيمًا من نوع واحد في شبكة بأي عدد من الأبعاد.

المهمةالكود
استيراد NumPyimport 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
العودة إلى قائمة Pythonm.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)
الدوال المثلثية و pinp.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)
حذف الأبعاد ذات الحجم 1np.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)
أعداد ذات حدين و Poissonrng.binomial(10, 0.5, size=5), rng.poisson(3, size=5)

الجبر الخطي

المهمةالكود
ضرب المصفوفاتA @ A
حل Ax = bnp.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)
إحصاءات تتجاهل NaNnp.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"]
كتابة نص CSVnp.savetxt("data.csv", m, delimiter=",", fmt="%d")
قراءة نص CSVnp.loadtxt("data.csv", delimiter=",")

NumPy 2: الأسماء القديمة وما تكتبه الآن

حذف NumPy 2 كثيرًا من الأسماء البديلة، لذا قد يفشل الكود المنسوخ من الدروس القديمة بخطأ AttributeError .

المهمةNumPy 2الصيغة القديمة
قيمة مفقودةnp.nannp.NaN
اللانهايةnp.infnp.Inf
نوع عشري 64 بتnp.float64np.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 المرجعية هذه مجانية تمامًا ولا تحتاج إلى تسجيل. أضفها إلى المفضلة أو اطبعها بصيغة PDF من متصفحك، وارجع إليها متى احتجت إلى الاستدعاء الدقيق لعملية reshape أو جمع على محور أو سحب عشوائي.
ما إصدار NumPy الذي تغطيه هذه الورقة المرجعية؟
NumPy 2. كل المقتطفات تعمل على NumPy 2.4، وهو الإصدار الذي يشغّله Coddy. حذف NumPy 2 أسماء بديلة مثل 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؟
تخزّن المصفوفات نوعًا واحدًا في كتلة واحدة من الذاكرة، لذا تعمل العمليات الحسابية على المصفوفة كاملة بكود مُصرَّف، وتكون غالبًا أسرع بمرات كثيرة من حلقة 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 تعملان، لكنهما الواجهة القديمة.
هل يمكنني تشغيل كود NumPy عبر الإنترنت؟
نعم. ساحة تجربة Matplotlib المجانية تشغّل Python مع NumPy و pandas و Matplotlib و scikit-learn في متصفحك، فيمكنك لصق أي مقتطف من هذه الورقة المرجعية وتشغيله دون تثبيت أي شيء. ودورة تعلم الآلة في Coddy تعلّمك NumPy خطوة بخطوة كجزء من العمل على بيانات حقيقية.
رسم توضيحي للغات البرمجة في Coddy

تعلّم NumPy مع Coddy

ابدأ الآن