اكتشف قوة NumPy للحساب الرياضي الفعال والمتقدم. يغطي هذا الدليل عمليات المصفوفات، الجبر الخطي، الإحصاء، والمزيد، مع أمثلة عالمية.
عمليات مصفوفات NumPy: دليل شامل للحساب الرياضي
NumPy، اختصار لـ Numerical Python، هي حزمة أساسية للحوسبة العلمية في بايثون. توفر أدوات قوية للعمل مع البيانات الرقمية، وخاصة المصفوفات. يستكشف هذا الدليل الجوانب الأساسية لعمليات مصفوفات NumPy للحساب الرياضي، مقدماً منظوراً عالمياً وأمثلة عملية لتمكين علماء البيانات والمهندسين والباحثين في جميع أنحاء العالم.
مقدمة إلى مصفوفات NumPy
في جوهرها، تقدم NumPy الكائن ndarray، وهو كائن مصفوفة متعدد الأبعاد أكثر كفاءة وتنوعاً من قوائم بايثون المدمجة للعمليات العددية. المصفوفات هي هياكل بيانات متجانسة – مما يعني أن العناصر تشترك عادةً في نفس نوع البيانات (مثل الأعداد الصحيحة، الأعداد العشرية). هذا التجانس أمر بالغ الأهمية لتحسين الأداء.
للبدء باستخدام NumPy، تحتاج أولاً إلى تثبيتها (إذا لم تكن لديك بالفعل):
pip install numpy
ثم، قم باستيراد الحزمة إلى بيئة بايثون الخاصة بك:
import numpy as np
الاسم المستعار np هو اصطلاح متبع على نطاق واسع ويجعل شيفرتك البرمجية أكثر قابلية للقراءة.
إنشاء مصفوفات NumPy
يمكن إنشاء المصفوفات من القوائم، والمجموعات، والكائنات الأخرى الشبيهة بالمصفوفات. إليك بعض الأمثلة:
- إنشاء مصفوفة من قائمة:
import numpy as np
my_list = [1, 2, 3, 4, 5]
my_array = np.array(my_list)
print(my_array) # Output: [1 2 3 4 5]
- إنشاء مصفوفة متعددة الأبعاد:
import numpy as np
my_matrix = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
my_array = np.array(my_matrix)
print(my_array)
# Output:
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
- إنشاء مصفوفات بقيم محددة:
import numpy as np
zeros_array = np.zeros(5) # Creates an array of 5 zeros: [0. 0. 0. 0. 0.]
ones_array = np.ones((2, 3)) # Creates a 2x3 array of ones: [[1. 1. 1.]
# [1. 1. 1.]]
range_array = np.arange(0, 10, 2) # Creates an array from 0 to 10 (exclusive), incrementing by 2: [0 2 4 6 8]
linspace_array = np.linspace(0, 1, 5) # Creates an array with 5 evenly spaced values from 0 to 1: [0. 0.25 0.5 0.75 1. ]
سمات المصفوفة
تحتوي مصفوفات NumPy على العديد من السمات التي توفر معلومات قيمة حول المصفوفة:
shape: تُعيد أبعاد المصفوفة (الصفوف، الأعمدة، إلخ).dtype: تُعيد نوع بيانات عناصر المصفوفة.ndim: تُعيد عدد أبعاد المصفوفة (محاورها).size: تُعيد العدد الإجمالي للعناصر في المصفوفة.
import numpy as np
my_array = np.array([[1, 2, 3], [4, 5, 6]])
print(my_array.shape) # Output: (2, 3)
print(my_array.dtype) # Output: int64 (or similar, depending on your system)
print(my_array.ndim) # Output: 2
print(my_array.size) # Output: 6
عمليات المصفوفات الأساسية
تسمح لك NumPy بإجراء عمليات على مستوى العنصر في المصفوفات، مما يبسط العمليات الحسابية الرياضية. غالباً ما تكون هذه العمليات أسرع بكثير من إجراء نفس العمليات باستخدام حلقات بايثون.
العمليات الحسابية
تُجرى العمليات الحسابية الأساسية (+، -، *، /، **) على مستوى العنصر. العمليات مُتجهّة (vectorized)، مما يعني أنها تعمل على جميع عناصر المصفوفة في وقت واحد.
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# Addition
c = a + b
print(c) # Output: [5 7 9]
# Subtraction
d = b - a
print(d) # Output: [3 3 3]
# Multiplication
e = a * b
print(e) # Output: [ 4 10 18]
# Division
f = b / a
print(f) # Output: [4. 2.5 2. ]
# Exponentiation
g = a ** 2
print(g) # Output: [1 4 9]
البث (Broadcasting)
البث (Broadcasting) هو آلية قوية في NumPy تسمح بإجراء عمليات على المصفوفات ذات الأشكال المختلفة. يتم "بث" المصفوفة الأصغر عبر المصفوفة الأكبر بحيث تكون لهما أشكال متوافقة. يحدث هذا غالباً بشكل ضمني، مما يبسط الشيفرة.
على سبيل المثال، يمكنك إضافة قيمة عددية إلى مصفوفة:
import numpy as np
a = np.array([1, 2, 3])
result = a + 5
print(result) # Output: [6 7 8]
هنا، يتم بث القيمة العددية 5 إلى شكل a، مما يؤدي فعلياً إلى إنشاء مصفوفة [5, 5, 5] ثم تُضاف إلى a.
فهرسة المصفوفات وتقطيعها (Slicing)
توفر NumPy طرقاً مرنة للوصول إلى عناصر المصفوفة وتعديلها.
- الفهرسة (Indexing): الوصول إلى العناصر الفردية باستخدام فهارسها.
- التقطيع (Slicing): الوصول إلى نطاق من العناصر باستخدام قيم البداية والنهاية والخطوة.
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Indexing
element = a[0, 1] # Access the element in the first row, second column
print(element) # Output: 2
# Slicing
row_slice = a[1:3, :] # Get rows 1 and 2, all columns
print(row_slice)
# Output:
# [[4 5 6]
# [7 8 9]]
col_slice = a[:, 1] # Get all rows, second column
print(col_slice) # Output: [2 5 8]
تتوفر أيضاً الفهرسة المتقدمة، مثل الفهرسة المنطقية (boolean indexing) والفهرسة الفاخرة (fancy indexing) (باستخدام مصفوفات من الفهارس)، مما يوفر تحكماً أكبر.
الدوال الرياضية
توفر NumPy مجموعة شاملة من الدوال الرياضية التي تعمل على المصفوفات، بما في ذلك الدوال المثلثية، والدوال الأسية واللوغاريتمية، والدوال الإحصائية، والمزيد.
الدوال المثلثية
توفر NumPy دوال مثلثية قياسية مثل sin()، cos()، tan()، arcsin()، arccos()، arctan()، إلخ، والتي تعمل على مستوى العنصر.
import numpy as np
a = np.array([0, np.pi/2, np.pi])
sin_values = np.sin(a)
print(sin_values) # Output: [0.000e+00 1.000e+00 1.225e-16] (approximately, due to floating-point precision)
الدوال الأسية واللوغاريتمية
تتوفر أيضاً دوال مثل exp()، log()، log10()، و sqrt().
import numpy as np
a = np.array([1, 2, 3])
exp_values = np.exp(a)
print(exp_values)
# Output: [ 2.71828183 7.3890561 20.08553692]
log_values = np.log(a)
print(log_values)
# Output: [0. 0.69314718 1.09861229]
الدوال الإحصائية
تتضمن NumPy دوال للتحليل الإحصائي:
mean(): يحسب متوسط عناصر المصفوفة.median(): يحسب الوسيط.std(): يحسب الانحراف المعياري.var(): يحسب التباين.min(): يجد القيمة الدنيا.max(): يجد القيمة القصوى.sum(): يحسب مجموع عناصر المصفوفة.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.mean(a)) # Output: 3.0
print(np.std(a)) # Output: 1.4142135623730951
print(np.sum(a)) # Output: 15
الجبر الخطي باستخدام NumPy
توفر NumPy أدوات قوية لعمليات الجبر الخطي، الضرورية لمختلف المجالات مثل تعلم الآلة والفيزياء والهندسة. تحتوي الوحدة numpy.linalg على العديد من وظائف الجبر الخطي.
عمليات المصفوفات
- ضرب المصفوفات: يقوم المعامل
@(أوnp.dot()) بإجراء ضرب المصفوفات. - منقول المصفوفة (Matrix transpose): استخدم السمة
.Tأو الدالةnp.transpose(). - المحددة (Determinant): تحسب الدالة
np.linalg.det()محدد المصفوفة المربعة. - المعكوس (Inverse): تحسب الدالة
np.linalg.inv()معكوس المصفوفة المربعة القابلة للعكس.
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# Matrix multiplication
c = a @ b # Or np.dot(a, b)
print(c)
# Output:
# [[19 22]
# [43 50]]
# Matrix transpose
d = a.T
print(d)
# Output:
# [[1 3]
# [2 4]]
# Determinant
e = np.linalg.det(a)
print(e) # Output: -2.0
حل المعادلات الخطية
يمكن لـ NumPy حل أنظمة المعادلات الخطية باستخدام np.linalg.solve().
import numpy as np
# Solve the system of equations:
# 2x + y = 5
# x + 3y = 8
a = np.array([[2, 1], [1, 3]])
b = np.array([5, 8])
x = np.linalg.solve(a, b)
print(x) # Output: [1. 3.] (approximately)
القيم الذاتية والمتجهات الذاتية
تحسب الدالة np.linalg.eig() القيم الذاتية والمتجهات الذاتية لمصفوفة مربعة.
import numpy as np
a = np.array([[1, 2], [2, 1]])
eigenvalues, eigenvectors = np.linalg.eig(a)
print('Eigenvalues:', eigenvalues)
print('Eigenvectors:', eigenvectors)
أمثلة عملية: تطبيقات عالمية
تُستخدم NumPy على نطاق واسع في مجالات مختلفة عالمياً. إليك بعض الأمثلة:
1. معالجة الصور
تُمثل الصور كمصفوفات متعددة الأبعاد، مما يسمح بمعالجة فعالة باستخدام NumPy. من المعالجات الأساسية مثل تصحيح الألوان إلى التقنيات المتقدمة مثل اكتشاف الحواف والتعرف على الكائنات (التي تُستخدم غالباً في تطبيقات الرؤية الحاسوبية حول العالم، بما في ذلك في المركبات ذاتية القيادة التي يجري تطويرها في ألمانيا والصين)، تعد NumPy في صميم ذلك.
# Simplified Example:
import numpy as np
from PIL import Image # Requires the Pillow library
# Load an image (replace 'image.png' with your image file)
try:
img = Image.open('image.png')
except FileNotFoundError:
print('Error: image.png not found. Please place it in the same directory or change the path.')
exit()
img_array = np.array(img)
# Convert to grayscale (average the RGB channels)
grayscale_img = np.mean(img_array, axis=2, keepdims=False).astype(np.uint8)
# Display or save the grayscale image (requires a library like matplotlib)
from PIL import Image
grayscale_image = Image.fromarray(grayscale_img)
grayscale_image.save('grayscale_image.png')
print('Grayscale image saved as grayscale_image.png')
2. علم البيانات وتعلم الآلة
NumPy هي الأساس للعديد من مكتبات علم البيانات في بايثون، مثل Pandas وscikit-learn وTensorFlow. تُستخدم لتنظيف البيانات، ومعالجتها، وهندسة الميزات، وتدريب النماذج، وتقييمها. يعتمد الباحثون والممارسون في جميع أنحاء العالم على NumPy لبناء نماذج تنبؤية، وتحليل مجموعات البيانات، واستخلاص الرؤى من البيانات، من النمذجة المالية في الولايات المتحدة إلى أبحاث المناخ في أستراليا.
# Example: Calculating the mean of a dataset
import numpy as np
data = np.array([10, 12, 15, 18, 20])
mean_value = np.mean(data)
print(f'The mean of the data is: {mean_value}')
3. الحوسبة العلمية
يستخدم العلماء والمهندسون في جميع أنحاء العالم، من وكالة الفضاء الأوروبية إلى مؤسسات الأبحاث في الهند، NumPy للمحاكاة والنمذجة وتحليل البيانات. على سبيل المثال، يستخدمونها لمحاكاة ديناميكا السوائل، وتحليل البيانات التجريبية، وتطوير الخوارزميات العددية.
# Example: Simulating a simple physical system
import numpy as np
# Define time parameters
time = np.linspace(0, 10, 100) # Time from 0 to 10 seconds, 100 points
# Define parameters (example: constant acceleration)
acceleration = 9.8 # m/s^2 (gravitational acceleration)
initial_velocity = 0 # m/s
initial_position = 0 # m
# Calculate position over time using the kinematic equation: x = x0 + v0*t + 0.5*a*t^2
position = initial_position + initial_velocity * time + 0.5 * acceleration * time**2
# Output results (for plotting, etc.)
print(position)
4. النمذجة المالية
يستخدم المحللون الماليون NumPy لمهام مثل تحسين المحفظة، وإدارة المخاطر، والنمذجة المالية. تُستخدم في شركات الاستثمار عالمياً، بما في ذلك تلك الموجودة في سويسرا واليابان، للتعامل مع مجموعات البيانات الكبيرة وإجراء حسابات معقدة بكفاءة.
# Example: Calculating the Compound Annual Growth Rate (CAGR)
import numpy as np
initial_investment = 10000 # USD
final_value = 15000 # USD
number_of_years = 5 # Years
# Calculate CAGR
cagr = ( (final_value / initial_investment)**(1 / number_of_years) - 1 ) * 100
print(f'The CAGR is: {cagr:.2f}%')
تحسين شيفرة NumPy
للاستفادة القصوى من أداء NumPy، ضع في اعتبارك هذه النصائح:
- التوجيه (Vectorization): تجنب حلقات بايثون الصريحة كلما أمكن؛ عمليات NumPy موجهة وأسرع بكثير.
- أنواع البيانات (Data Types): اختر أنواع البيانات المناسبة لتقليل استخدام الذاكرة.
- طرق عرض المصفوفات (Array Views): استخدم طرق عرض المصفوفات (مثل التقطيع) بدلاً من نسخ المصفوفات لتجنب تخصيص الذاكرة غير الضروري.
- تجنب النسخ غير الضرورية (Avoid Unnecessary Copies): كن حذراً من العمليات التي تنشئ نسخاً (مثل استخدام array.copy()).
- استخدام الدوال المدمجة (Use Built-in Functions): استفد من دوال NumPy المدمجة والمُحسَّنة كلما كانت متاحة (مثل
np.sum()،np.mean()).
الخاتمة
NumPy هي حجر الزاوية في الحوسبة العلمية وتحليل البيانات. إتقان عمليات مصفوفات NumPy يمكّنك من التعامل بكفاءة مع البيانات العددية، وإجراء حسابات معقدة، وتطوير حلول مبتكرة عبر مجالات متنوعة. يعكس تبنيها عالمياً تنوعها ودورها الأساسي في المساعي الحديثة القائمة على البيانات. يقدم هذا الدليل أساساً لاستكشاف الإمكانيات الغنية لـ NumPy وتطبيقاتها في عالم تعتبر فيه البيانات محور التقدم.
للمزيد من التعلم
لمتابعة رحلتك التعليمية، ضع في اعتبارك هذه المصادر:
- توثيقات NumPy: توثيقات NumPy الرسمية شاملة ومفصلة. https://numpy.org/doc/stable/
- دورات تدريبية عبر الإنترنت: تقدم منصات مثل Coursera وedX وUdemy العديد من الدورات حول NumPy وعلم البيانات.
- الكتب: استكشف الكتب حول بايثون لعلوم البيانات والحوسبة العلمية، والتي غالباً ما تتضمن فصولاً عن NumPy.
- الممارسة: اعمل على حل المشكلات والمشاريع النموذجية لترسيخ فهمك. تقدم Kaggle ومنصات أخرى مجموعات بيانات وتحديات للممارسة عليها.