الدليل الشامل لحزمة NumPy للحوسبة العلمية في بايثون

دقائق القراءة: 14

مقدمة إلى مكتبة NumPy في بايثون

تُعد مكتبة NumPy (وتُنطق "نم باي") إحدى أهم الحزم التي يجب إتقانها عند البدء في تعلم لغة Python، خاصةً للمتخصصين في الحوسبة العلمية وتحليل البيانات. تشتهر هذه الحزمة ببنية بيانات مفيدة للغاية تُعرف باسم NumPy array (مصفوفة NumPy). كما أنها تُمكّن مطوري Python من إجراء مجموعة واسعة من العمليات الحسابية العددية بسرعة وكفاءة عالية. سيعلمك هذا الدليل أساسيات NumPy التي يمكنك استخدامها لبناء تطبيقات Python عددية قوية اليوم.

ما هي مكتبة NumPy؟

NumPy هي مكتبة Python مخصصة للحوسبة العلمية. اسمها هو اختصار لعبارة Numerical Python (بايثون العددية). إليك الوصف الرسمي للمكتبة من موقعها على الويب:

NumPy هي الحزمة الأساسية للحوسبة العلمية باستخدام Python. تحتوي، من بين أمور أخرى، على:

  • كائن مصفوفة قوي متعدد الأبعاد (N-dimensional array object).
  • دوال بث (broadcasting functions) متطورة.
  • أدوات لدمج أكواد C/C++ و Fortran.
  • قدرات مفيدة في الجبر الخطي، تحويل فورييه (Fourier transform)، وتوليد الأرقام العشوائية.

بالإضافة إلى استخداماتها العلمية الواضحة، يمكن استخدام NumPy أيضًا كحاوية فعالة متعددة الأبعاد للبيانات العامة. يمكن تعريف أنواع بيانات عشوائية، مما يسمح لـ NumPy بالاندماج بسلاسة وسرعة مع مجموعة واسعة من قواعد البيانات. NumPy مرخصة بموجب ترخيص BSD license، مما يتيح إعادة استخدامها بقيود قليلة.”

تُعد NumPy مكتبة Python بالغة الأهمية لدرجة أن هناك مكتبات أخرى (بما في ذلك pandas) مبنية بالكامل عليها.

الفائدة الرئيسية لمكتبة NumPy

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

ماذا سنتعلم عن NumPy؟

يقضي ممارسو Python المتقدمون وقتًا أطول في العمل مع pandas مقارنة بـ NumPy. ومع ذلك، نظرًا لأن pandas مبنية على NumPy، فمن المهم فهم الجوانب الأكثر أهمية في مكتبة NumPy. على مدار الأقسام التالية، سنغطي المعلومات التالية حول مكتبة NumPy:

  • مصفوفات NumPy.
  • الفهرسة والإسناد في NumPy.
  • أساليب وعمليات NumPy.

لننتقل الآن إلى تعلم مصفوفات NumPy، وهي بنية البيانات الأساسية التي يجب أن يكون كل ممارس لـ NumPy على دراية بها.

مصفوفات NumPy (NumPy Arrays)

في هذا القسم، سنتعلم عن مصفوفات NumPy.

ما هي مصفوفات NumPy؟

مصفوفات NumPy هي الطريقة الرئيسية لتخزين البيانات باستخدام مكتبة NumPy. إنها تشبه القوائم العادية في Python، ولكنها تتميز بكونها أسرع وتحتوي على المزيد من الأساليب المدمجة. تُنشأ مصفوفات NumPy عن طريق استدعاء الأسلوب array() من مكتبة NumPy. داخل هذا الأسلوب، يجب تمرير قائمة. يوضح المثال التالي مصفوفة NumPy أساسية. لاحظ أنه بينما أقوم بتشغيل عبارة import numpy as np في بداية كتلة الكود هذه، سيتم استبعادها من كتل الكود الأخرى في هذا القسم للإيجاز.

import numpy as np
sample_list = [1, 2, 3]
np.array(sample_list)

سينتج عن السطر الأخير من كتلة الكود هذه مخرجًا يبدو كالتالي:

array([1, 2, 3])

يشير الغلاف array() إلى أن هذه لم تعد قائمة Python عادية، بل هي مصفوفة NumPy.

الأنواع المختلفة لمصفوفات NumPy: المتجهات والمصفوفات

هناك نوعان مختلفان من مصفوفات NumPy: المتجهات (vectors) والمصفوفات (matrices). المتجهات هي مصفوفات NumPy أحادية البعد، وتبدو كالتالي:

my_vector = np.array(['this', 'is', 'a', 'vector'])

المصفوفات هي مصفوفات ثنائية الأبعاد وتُنشأ عن طريق تمرير قائمة من القوائم إلى الأسلوب np.array(). إليك مثال:

my_matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
np.array(my_matrix)

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

الأساليب المدمجة في مصفوفات NumPy

تأتي مصفوفات NumPy مع عدد من الأساليب المدمجة المفيدة. سنقضي بقية هذا القسم في مناقشة هذه الأساليب بالتفصيل.

إنشاء نطاق من الأرقام باستخدام arange

لدى NumPy أسلوب مفيد يُسمى arange يأخذ رقمين ويعطيك مصفوفة من الأعداد الصحيحة التي تكون أكبر من أو تساوي (>=) الرقم الأول وأقل من (<) الرقم الثاني. إليك مثال على أسلوب arange:

np.arange(0, 5) #Returns array([0, 1, 2, 3, 4])

يمكنك أيضًا تضمين متغير ثالث في أسلوب arange يوفر حجم خطوة (step-size) للدالة. تمرير 2 كمتغير ثالث سيعيد كل رقم ثانٍ في النطاق، وتمرير 5 سيعيد كل رقم خامس، وهكذا. إليك مثال على استخدام المتغير الثالث في أسلوب arange:

np.arange(1, 11, 2) #Returns array([1, 3, 5, 7, 9])

توليد مصفوفات من الأصفار والآحاد

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

np.zeros(4) #Returns array([0., 0., 0., 0.])

يمكنك أيضًا القيام بشيء مماثل باستخدام مصفوفات ثلاثية الأبعاد. على سبيل المثال، np.zeros((5, 5)) تُنشئ مصفوفة 5×5 تحتوي على جميع الأصفار. يمكننا إنشاء مصفوفات من الآحاد باستخدام أسلوب مشابه يُسمى ones. إليك مثال:

np.ones(5) #Returns array([1., 1., 1., 1., 1.])

تقسيم نطاق من الأرقام بالتساوي باستخدام linspace

هناك العديد من المواقف التي يكون لديك فيها نطاق من الأرقام وترغب في تقسيم هذا النطاق بالتساوي إلى فترات. صُمم أسلوب linspace الخاص بـ NumPy لحل هذه المشكلة. يأخذ linspace ثلاث حجج:

  • بداية الفترة.
  • نهاية الفترة.
  • عدد الفترات الفرعية التي ترغب في تقسيم الفترة إليها.

إليك مثال على أسلوب linspace:

np.linspace(0, 1, 10) #Returns array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

إنشاء مصفوفة الوحدة (Identity Matrix)

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

np.eye(1) #Returns a 1x1 identity matrix
np.eye(2) #Returns a 2x2 identity matrix
np.eye(50) #Returns a 50x50 identity matrix

توليد أرقام عشوائية باستخدام NumPy

لدى NumPy عدد من الأساليب المدمجة التي تتيح لك إنشاء مصفوفات من الأرقام العشوائية. تبدأ كل هذه الأساليب بـ random. إليك بعض الأمثلة:

np.random.rand(sample_size) #Returns a sample of random numbers between 0 and 1.
#Sample size can either be one integer (for a one-dimensional array) or two integers separated by commas (for a two-dimensional array).

np.random.randn(sample_size) #Returns a sample of random numbers between 0 and 1, following the normal distribution.
#Sample size can either be one integer (for a one-dimensional array) or two integers separated by commas (for a two-dimensional array).

np.random.randint(low, high, sample_size) #Returns a sample of integers that are greater than or equal to 'low' and less than 'high'.

إعادة تشكيل مصفوفات NumPy (Reshaping)

من الشائع جدًا أخذ مصفوفة بأبعاد معينة وتحويلها إلى شكل مختلف. على سبيل المثال، قد يكون لديك مصفوفة أحادية البعد تحتوي على 10 عناصر وترغب في تحويلها إلى مصفوفة ثنائية الأبعاد بحجم 2×5. إليك مثال:

arr = np.array([0, 1, 2, 3, 4, 5])
arr.reshape(2, 3)

مخرج هذه العملية هو:

array([[0, 1, 2],
       [3, 4, 5]])

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

arr = np.array([0, 1, 2, 3, 4, 5])
arr.shape #Returns (6,) - لاحظ أنه لا يوجد عنصر ثانٍ لأنها مصفوفة أحادية البعد
arr = arr.reshape(2, 3)
arr.shape #Returns (2, 3)

يمكنك أيضًا دمج أسلوب reshape مع خاصية shape في سطر واحد كالتالي:

arr.reshape(2, 3).shape #Returns (2, 3)

إيجاد القيمة القصوى والدنيا في مصفوفة NumPy

لإنهاء هذا القسم، دعنا نتعلم عن أربعة أساليب مفيدة لتحديد القيم القصوى والدنيا داخل مصفوفة NumPy. سنعمل مع هذه المصفوفة:

simple_array = np.array([1, 2, 3, 4])

يمكننا استخدام أسلوب max لإيجاد القيمة القصوى لمصفوفة NumPy. إليك مثال:

simple_array.max() #Returns 4

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

simple_array.argmax() #Returns 3

وبالمثل، يمكننا استخدام أساليب min و argmin لإيجاد قيمة وفهرس القيمة الدنيا داخل مصفوفة NumPy.

simple_array.min() #Returns 1
simple_array.argmin() #Returns 0

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

عمليات وأساليب NumPy

في هذا القسم، سنعمل على استكشاف العمليات المختلفة المتضمنة في مكتبة NumPy. طوال هذا القسم، سنفترض أن أمر import numpy as np قد تم تشغيله بالفعل.

المصفوفة المستخدمة في هذا القسم

لهذا القسم، سأعمل مع مصفوفة بطول 4 تم إنشاؤها باستخدام np.arange في جميع الأمثلة. إذا كنت ترغب في مقارنة مصفوفتي بالمخرجات المستخدمة في هذا القسم، فإليك كيفية إنشاء وطباعة المصفوفة:

arr = np.arange(4)
arr

قيم المصفوفة هي:

array([0, 1, 2, 3])

إجراء العمليات الحسابية في بايثون باستخدام NumPy

تُسهّل NumPy بشكل كبير إجراء العمليات الحسابية على المصفوفات. يمكنك إما إجراء العمليات الحسابية باستخدام المصفوفة ورقم واحد، أو يمكنك إجراء العمليات الحسابية بين مصفوفتين من NumPy. نستكشف كل عملية من العمليات الرياضية الرئيسية أدناه.

الجمع

عند إضافة رقم واحد إلى مصفوفة NumPy، يُضاف هذا الرقم إلى كل عنصر في المصفوفة. إليك مثال:

2 + arr #Returns array([2, 3, 4, 5])

يمكنك إضافة مصفوفتين من NumPy باستخدام المعامل +. تُضاف المصفوفات على أساس عنصر بعنصر (مما يعني أن العناصر الأولى تُضاف معًا، والعناصر الثانية تُضاف معًا، وهكذا). إليك مثال:

arr + arr #Returns array([0, 2, 4, 6])

الطرح

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

arr - 10 #Returns array([-10, -9, -8, -7])
arr - arr #Returns array([0, 0, 0, 0])

الضرب

يُنفذ الضرب أيضًا على أساس عنصر بعنصر لكل من الأرقام الفردية ومصفوفات NumPy. إليك مثالان أدناه.

6 * arr #Returns array([ 0,  6, 12, 18])
arr * arr #Returns array([0, 1, 4, 9])

القسمة

في هذه المرحلة، ربما لن تتفاجأ عندما تعلم أن القسمة التي تُنفذ على مصفوفات NumPy تتم على أساس عنصر بعنصر. إليك مثال على قسمة arr على رقم واحد:

arr / 2 #Returns array([0. , 0.5, 1. , 1.5])

توجد للقسمة استثناء ملحوظ مقارنة بالعمليات الرياضية الأخرى التي رأيناها في هذا القسم. نظرًا لأننا لا نستطيع القسمة على صفر، فإن القيام بذلك سيؤدي إلى ملء الحقل المقابل بقيمة nan، وهي اختصار في Python لـ “ليس رقمًا” (Not A Number). ستطبع Jupyter Notebook أيضًا تحذيرًا يبدو كالتالي:

RuntimeWarning: invalid value encountered in true_divide

إليك مثال على القسمة على صفر باستخدام مصفوفة NumPy:

arr / arr #Returns array([nan,  1.,  1.,  1.])

سنتعلم كيفية التعامل مع قيم nan بمزيد من التفصيل لاحقًا.

العمليات المعقدة في مصفوفات NumPy

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

حساب الجذور التربيعية باستخدام NumPy

يمكنك حساب الجذر التربيعي لكل عنصر في مصفوفة باستخدام أسلوب np.sqrt:

np.sqrt(arr) #Returns array([0.        , 1.        , 1.41421356, 1.73205081])

إليك العديد من الأمثلة الأخرى (لاحظ أنك لن تُختبر عليها، ولكن لا يزال من المفيد رؤية قدرات NumPy):

np.exp(arr) #Returns e^element for every element in the array
np.sin(arr) #Calculate the trigonometric sine of every value in the array
np.cos(arr) #Calculate the trigonometric cosine of every value in the array
np.log(arr) #Calculate the base-ten logarithm of every value in the array

في هذا القسم، استكشفنا الأساليب والعمليات المختلفة المتاحة في مكتبة NumPy Python. سنختبر معرفتك بهذه المفاهيم في المشكلات التدريبية المقدمة لاحقًا.

الفهرسة والإسناد في مصفوفات NumPy

في هذا القسم، سنستكشف الفهرسة (indexing) والإسناد (assignment) في مصفوفات NumPy.

المصفوفة المستخدمة في هذا القسم

كما كان الحال من قبل، سأستخدم مصفوفة محددة خلال هذا القسم. هذه المرة سيتم إنشاؤها باستخدام أسلوب np.random.rand. إليك كيفية إنشاء المصفوفة:

arr = np.random.rand(5)

إليك المصفوفة الفعلية:

array([0.69292946, 0.9365295 , 0.65682359, 0.72770856, 0.83268616])

لجعل هذه المصفوفة أسهل في القراءة، سأقوم بتقريب كل عنصر من عناصر المصفوفة إلى منزلتين عشريتين باستخدام أسلوب round الخاص بـ NumPy:

arr = np.round(arr, 2)

إليك المصفوفة الجديدة:

array([0.69, 0.94, 0.66, 0.73, 0.83])

استرجاع عنصر معين من مصفوفة NumPy

يمكننا تحديد (واسترجاع) عنصر معين من مصفوفة NumPy بنفس الطريقة التي نستخدمها مع قائمة Python العادية: باستخدام الأقواس المربعة (square brackets). إليك مثال:

arr[0] #Returns 0.69

يمكننا أيضًا الإشارة إلى عناصر متعددة من مصفوفة NumPy باستخدام عامل النقطتين (colon operator). على سبيل المثال، الفهرس [2:] يحدد كل عنصر من الفهرس 2 فصاعدًا. الفهرس [:3] يحدد كل عنصر حتى الفهرس 3 باستثناء الفهرس 3. الفهرس [2:4] يعيد كل عنصر من الفهرس 2 إلى الفهرس 4، باستثناء الفهرس 4. دائمًا ما يتم استبعاد نقطة النهاية العليا. إليك بعض الأمثلة على الفهرسة باستخدام عامل النقطتين:

arr[:] #Returns the entire array: array([0.69, 0.94, 0.66, 0.73, 0.83])
arr[1:] #Returns array([0.94, 0.66, 0.73, 0.83])
arr[1:4] #Returns array([0.94, 0.66, 0.73])

إسناد القيم للعناصر في مصفوفات NumPy

يمكننا إسناد قيم جديدة لعنصر في مصفوفة NumPy باستخدام عامل =، تمامًا مثل قوائم Python العادية. إليك بعض الأمثلة (لاحظ أن هذه كلها كتلة كود واحدة، مما يعني أن إسنادات العناصر تُنفذ من خطوة إلى أخرى).

arr[0] = 0.12
arr #Returns array([0.12, 0.94, 0.66, 0.73, 0.83])

arr[:] = 0
arr #Returns array([0., 0., 0., 0., 0.])

arr[2:5] = 0.5
arr #Returns array([0. , 0. , 0.5, 0.5, 0.5])

الإشارة إلى المصفوفات (Array Referencing) في NumPy

تستخدم NumPy مفهومًا يُسمى ‘الإشارة إلى المصفوفات’ (array referencing) وهو مصدر شائع جدًا للارتباك للأشخاص الجدد على المكتبة. لفهم الإشارة إلى المصفوفات، دعنا نأخذ مثالًا أولاً:

new_array = np.array([6, 7, 8, 9])
second_new_array = new_array[0:2]
second_new_array #Returns array([6, 7])
second_new_array[1] = 4
second_new_array #Returns array([6, 4]), كما هو متوقع
new_array #Returns array([6, 4, 8, 9])
#وهو يختلف عن قيمته الأصلية array([6, 7, 8, 9])
#ما هذا بحق الجحيم؟

كما ترى، فإن تعديل second_new_array غيّر أيضًا قيمة new_array. لماذا حدث هذا؟ بشكل افتراضي، لا تُنشئ NumPy نسخة من المصفوفة عندما تشير إلى متغير المصفوفة الأصلي باستخدام عامل الإسناد =. بدلاً من ذلك، إنها ببساطة تشير إلى المتغير الجديد إلى المتغير القديم، مما يسمح للمتغير الثاني بإجراء تعديلات على المتغير الأصلي – حتى لو لم يكن هذا هو قصدك. قد يبدو هذا غريبًا، ولكنه يحتوي على تفسير منطقي. الغرض من الإشارة إلى المصفوفات هو الحفاظ على قوة الحوسبة. عند العمل مع مجموعات بيانات كبيرة، ستنفد ذاكرة الوصول العشوائي (RAM) بسرعة إذا أنشأت مصفوفة جديدة في كل مرة تريد فيها العمل مع شريحة من المصفوفة.

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

array_to_copy = np.array([1, 2, 3])
copied_array = array_to_copy.copy()
array_to_copy #Returns array([1, 2, 3])
copied_array #Returns array([1, 2, 3])

كما ترى أدناه، فإن إجراء تعديلات على المصفوفة المنسوخة لا يغير المصفوفة الأصلية.

copied_array[0] = 9
copied_array #Returns array([9, 2, 3])
array_to_copy #Returns array([1, 2, 3])

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

فهرسة مصفوفات NumPy ثنائية الأبعاد

للبدء، دعنا نُنشئ مصفوفة NumPy ثنائية الأبعاد تُسمى mat:

mat = np.array([[5, 10, 15],[20, 25, 30],[35, 40, 45]])
mat

الناتج:

array([[ 5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])

هناك طريقتان لفهرسة مصفوفة NumPy ثنائية الأبعاد:

  • mat[row, col]
  • mat[row][col]

أفضل شخصيًا الفهرسة باستخدام تسمية mat[row][col] لأنها أسهل في التصور خطوة بخطوة. على سبيل المثال:

#أولاً، دعنا نحصل على الصف الأول:
mat[0]
#بعد ذلك، دعنا نحصل على العنصر الأخير من الصف الأول:
mat[0][-1]

يمكنك أيضًا إنشاء مصفوفات فرعية (sub-matrices) من مصفوفة NumPy ثنائية الأبعاد باستخدام هذا الترميز:

mat[1:][:2]

الناتج:

array([[20, 25, 30],
       [35, 40, 45]])

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

الاختيار الشرطي باستخدام مصفوفات NumPy

تدعم مصفوفات NumPy ميزة تُسمى ‘الاختيار الشرطي’ (conditional selection)، والتي تتيح لك إنشاء مصفوفة جديدة من القيم المنطقية (boolean values) التي توضح ما إذا كان كل عنصر داخل المصفوفة يفي بعبارة if معينة. إليك مثال على ذلك (لقد أعدت أيضًا إنشاء متغير arr الأصلي الخاص بنا لأنه مر وقت طويل منذ أن رأيناه):

arr = np.array([0.69, 0.94, 0.66, 0.73, 0.83])
arr > 0.7 #Returns array([False, True, False, True, True])

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

arr[arr > 0.7] #Returns array([0.94, 0.73, 0.83])

يمكن أن يصبح الاختيار الشرطي أكثر تعقيدًا بكثير من هذا. سنستكشف المزيد من الأمثلة في المشكلات التدريبية المرتبطة بهذا القسم.

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

الخلاصة التقنية

تُعد مكتبة NumPy حجر الزاوية في منظومة الحوسبة العلمية في Python، وتوفر أساسًا متينًا للتعامل مع البيانات العددية بكفاءة لا مثيل لها. من خلال بنيتها الأساسية المتمثلة في NumPy array، تُمكن المطورين من إجراء عمليات معقدة مثل الجبر الخطي، تحويلات فورييه، وتوليد الأرقام العشوائية بسرعة فائقة. لقد استعرضنا في هذا الدليل كيفية إنشاء هذه المصفوفات، والتحكم في أبعادها، وإجراء العمليات الحسابية الأساسية والمعقدة عليها، بالإضافة إلى فهم مفاهيم الفهرسة والإسناد والاختيار الشرطي. إن إتقان NumPy ليس مجرد مهارة إضافية، بل هو ضرورة لكل من يسعى للتميز في مجالات علم البيانات، التعلم الآلي، والهندسة العددية باستخدام Python، حيث تُشكل القاعدة التي تُبنى عليها مكتبات أخرى مثل pandas و scikit-learn. فهم هذه الأساسيات يفتح آفاقًا واسعة لتطوير تطبيقات تحليلية وحسابية قوية وفعالة.

اترك تعليقاً

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