مقدمة عن NumPy في بايثون

إذا كنت تعمل مع Python، فمن المفيد معرفة بعض أساسيات Python NumPy. إنه مفيد بشكل لا يصدق للعمل مع المصفوفات لأنه سريع وفعال للغاية. كما يحتوي أيضًا على العديد من الطرق لتسهيل التعامل مع العمليات العددية وتنفيذها على المصفوفات.

هناك العديد من هياكل البيانات في بايثون، بما في ذلك القوائم والقواميس وPandas DataFrames وبالطبع صفائف NumPy. ولكل منها نقاط قوة خاصة بها، ومعرفة متى تستخدم واحدة أو أخرى يمكن أن توفر الوقت والجهد في كتابة برامجك.

في هذه المقالة، سنعرض لك أساسيات NumPy ونشرح سبب أهميتها. سنقدم لك بعض الأمثلة لتساعدك على الوقوف على قدميك ونمنحك الأساس لجعل مشاريع تحليل البيانات الخاصة بك أكثر كفاءة. إذا كنت مهتمًا بمعرفة المزيد عن علوم البيانات في لغة Python، ففكر في اتباع هذا المسار المصمم للمبتدئين الذين ليس لديهم خبرة في مجال تكنولوجيا المعلومات.

لماذا NumPy؟

تحتوي المصفوفات في NumPy على العديد من أوجه التشابه مع هياكل البيانات الأخرى مثل القوائم. يمكنها تخزين البيانات الرقمية بالإضافة إلى السلاسل، وهي قابلة للتغيير، ويمكن تقطيعها وفهرستها بطرق مماثلة. ومع ذلك، لا يمكن للقائمة التعامل مع العمليات العددية بسهولة مثل المصفوفة.

لضرب كافة العناصر في مصفوفة في 2، استخدم array*2، حيث array هو اسم المصفوفة. يُعرف هذا باسم المتجهات. لفعل الشيء نفسه مع القائمة، يتطلب الأمر حلقة for أو فهم القائمة، وكلاهما يحتاج إلى المزيد من التعليمات البرمجية. علاوة على ذلك، فإن المصفوفات أسرع بكثير من القوائم، وتستهلك ذاكرة أقل بكثير نظرًا لأن توابع NumPy مُحسَّنة للغاية للعمل مع المصفوفات.

يعد Pandas بديلاً جيدًا آخر يوفر دوال لتحليل البيانات وتصورها. بنية البيانات الأساسية في Pandas هي السلسلة، والتي تشبه مصفوفة NumPy أحادية البعد. ومع ذلك، مرة أخرى، يعد NumPy أسرع وأكثر كفاءة عندما يتعلق الأمر بإجراء الحسابات الرقمية.

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

يكون لمصفوفات NumPy حجم ثابت عند الإنشاء، ويجب أن تكون العناصر من نفس نوع البيانات. هذان هما القيدان الرئيسيان اللذان يجب أخذهما في الاعتبار أثناء إنشاء المصفوفات. تحتوي الدالة array() على الوسائط التالية:

numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)

ومن أجل الإيجاز، لن نتناول وصفًا تفصيليًا لجميع الحجج. ألقِ نظرة على الوثائق إذا كنت مهتمًا بالتفاصيل. بالنسبة لغالبية التطبيقات، تحتاج فقط إلى تعريف الكائن وربما وسيطات dtype.

لتعريف مصفوفة ذات بعد واحد وطباعة شكلها، قم بما يلي:

>>> import numpy as np
>>> ar = np.array([1, 2, 3, 4])
>>> print(ar.shape)
(4,)

بالنسبة لمصفوفة NumPy متعددة الأبعاد، يأخذ الكائن شكل تسلسل متداخل، حيث تحدد التسلسلات الفردية صفوف المصفوفة. على سبيل المثال:

>>> ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> print(ar.shape)
(2, 4)

يمكن لمصفوفة NumPy أيضًا أن تحتوي على أنواع مختلفة من البيانات، على سبيل المثال، الأعداد الصحيحة والأعداد العشرية والسلاسل والقيم المنطقية. يمكنه حتى تخزين الأعداد المركبة. يمكننا تحويل العناصر الموجودة في المصفوفة أعلاه إلى سلاسل مباشرة كما يلي:

>>> ar_string = ar.astype(str)
>>> ar_string
array([['1', '2', '3', '4'],
         ['5', '6', '7', '8']], dtype='<U11')

وبدلاً من ذلك، يمكننا تعيين dtype=str عند تعريف المصفوفة. يمكن إنشاء مجموعة من القيم المنطقية على النحو التالي:

>>> np.array([[1, 1, 0, 0], [0, 1, 0, 1]], dtype=bool)
array([[True, True, False, False],
           [False, True, False, True]])

قد يكون هذا مفيدًا إذا كنت تريد إخفاء قيم معينة في مصفوفة أخرى.

هناك عدة طرق لتعريف مصفوفة ذات قيم عشوائية كعناصر نائبة لملء البيانات الحقيقية لاحقًا. تقوم الدالتان numpy.ones() و numpy.zeros() بإنشاء مصفوفة مليئة بالآحاد والأصفار، على التوالي.

تقوم الدالة numpy.empty()‎ بإنشاء مصفوفة دون تهيئة الإدخالات. تتطلب هذه الدالة المحددة من المستخدم تعيين جميع القيم في المصفوفة يدويًا ويجب استخدامها بحذر. ومع ذلك، قد يكون أسرع قليلاً من الدالتين الأخريين.

لاستخدام هذه الدوال، يجب تحديد حجم المصفوفة:

>>> np.zeros((3, 2))
array([[0., 0.],
       [0., 0.],
       [0., 0.]])

يمكن تعريف المصفوفات ذات التسلسل الثابت باستخدام دالتين مفيدتين من : arange و linspace. بالنسبة arange، تحتاج إلى تحديد قيم البداية والتوقف والخطوة. على سبيل المثال:

>>> np.arange(2, 20, 4)
array([ 2, 6, 10, 14, 18])

وهذا مشابه للدالة المضمنة range()، والذي يمكن استخدامه للتكرار. راجع هذه المقالة لمزيد من التفاصيل حول الحلقات في بايثون. تقوم الدالة linspace في NumPy بإرجاع أرقام متباعدة بشكل متساوٍ خلال فترة زمنية محددة بواسطة قيم البداية والتوقف. باستخدام نفس الوسائط كما في المثال الأخير :

>>> np.linspace(2, 20, 4)
array([ 2., 8., 14., 20.])

هنا، تحدد الوسيطة الثالثة عدد القيم المطلوب إرجاعها بدلاً من حجم الخطوة كما في المثال السابق.

قراءة وكتابة ملفات CSV

في أغلب الأحيان، تريد قراءة البيانات المحفوظة في ملف في مصفوفة NumPy. يأتي NumPy مزودًا ببعض الدوال للمساعدة في تحميل المصفوفات وحفظها. تركز هذه على التعامل مع البيانات الثنائية أو البيانات المخزنة في الملفات النصية. توفر الدالتان Load() و save() وظيفة تحميل وحفظ المصفوفات في ملف ثنائي.

إذا كنت تعمل مع ملفات نصية، وتحديدًا CSV في بايثون، فإن أفضل طريقة لقراءة المصفوفات وكتابتها في الملف هي باستخدام الدالتين LOADTXT() وSAVETXT(). يحتوي الأخير على وسيطتين مطلوبتين، fname وX، اللتين تحددان اسم الملف وبيانات المصفوفة المطلوب حفظها، على التوالي. للحفظ في ملف CSV، تحتاج أيضًا إلى تحديد delimiter. لتوضيح ذلك، دعونا ننشئ مصفوفة 2 × 4، ونحفظها في ملف CSV، ثم نعيد قراءتها مرة أخرى:

>>> ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> np.savetxt('output_array.csv', ar, delimiter=',')
>>> ar_read = np.loadtxt('output_array.csv', delimiter=',')
>>> ar_read
array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]])

يمكنك أيضًا استخدام بايثون والدالة open() المضمنة. إليك مقالة حول الكتابة إلى ملف في بايثون توضح لك كيفية القيام بذلك.

بعض توابع مصفوفة NumPy

الآن بعد أن تناولنا طرق إنشاء مصفوفة في بايثون، دعنا نلقي نظرة على ما يمكنك فعله بها. يحتوي NumPy على العديد من التوابع المفيدة والمحسنة للغاية والتي تسمح لك بإجراء عمليات المصفوفة والحصول على معلومات إضافية حول المصفوفة الخاصة بك.

كما ذكرنا في المقدمة، فإن إجراء العمليات الأساسية على المصفوفات مثل array1 + array2 هو أمر بسيط. هناك دوال فعالة للجبر الخطي، على سبيل المثال، لحساب النقطة أو الضرب الاتجاهي أو لاتخاذ تبديل مصفوفة.

الشرط الشائع هو تلخيص محتويات المصفوفة. يتضمن NumPy دوال لحساب الإحصائيات مثل المتوسط ​​والوسيط والانحراف المعياري وما إلى ذلك. وهي مفيدة لأنها تسمح لك بتحديد محور لحساب الإحصائية. افتراضيًا، يتم حساب الإحصائيات عبر مصفوفة مسطحة على سبيل المثال:

>>> ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> np.mean(ar)
4.5
 
>>> np.mean(ar, axis=0)
array([3., 4., 5., 6.])
 
>>> np.mean(ar, axis=1)
array([2.5, 6.5])

يؤدي تحديد axis=0 إلى حساب المتوسط ​​عبر الأعمدة، ويحسب axis=1 المتوسط ​​عبر الصفوف. الآن بعد أن عرفنا كيفية إنشاء إحصائية ملخصة، يمكننا إيجاد متوسط ​​الصفوف وإلحاق هذه المعلومات بعمود جديد في المصفوفة:

>>> row_mean = np.mean(ar, axis=1).reshape(2, 1)
>>> new_ar = np.append(ar, row_mean, axis=1)
>>> new_ar
array([[1., 2., 3., 4., 2.5],
       [5., 6., 7., 8., 6.5]])

هنا، نحسب إحصائيتنا، ونعيد تشكيلها، ثم نستخدم وظيفة append لإضافتها كعمود جديد. لاحظ أن نوع بيانات المصفوفة بأكملها قد تغير نظرًا لأن إحصائيات الملخص لدينا عبارة عن أرقام فاصلة عائمة.

انطلق للأمام مع NumPy

NumPy هي أداة أساسية في تحليلات بيانات Python. إنها مكتبة ناضجة تحتوي على عدد كبير من الوظائف والأساليب المفيدة بالإضافة إلى السرعة والكفاءة في جوهرها. الآن بعد أن تعرفت على أساسيات NumPy، يمكنك استخدام ما تعلمته هنا لجعل مشاريعك أكثر كفاءة.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading