تُعدُّ المصفوفات ثنائية الأبعاد، أو المصفوفات، من هياكل البيانات الأساسية في البرمجة، وهي بالغة الأهمية بشكل خاص لمهام مثل معالجة الصور، والجبر الخطي، وتطوير الألعاب. وبينما لا تحتوي بايثون على نوع مصفوفة ثنائية الأبعاد مدمج مثل بعض اللغات (مثل C++)، إلا أنها توفر عدة طرق فعالة وأنيقة لإنشائها والتلاعب بها. تستعرض هذه المقالة ثلاثة أساليب شائعة: التعبير القائم على القائمة، والحلقات المتداخلة، ومكتبة NumPy القوية.
جدول المحتويات
طريقة التعبير القائم على القائمة
يوفر التعبير القائم على القائمة طريقة موجزة و Pythonic لإنشاء مصفوفات ثنائية الأبعاد، وهو مفيد بشكل خاص عند البدء بقيم مُولَّدة من صيغ أو أنماط. يستخدم تعبيرات قائمة متداخلة، حيث تتعامل الحلقة الخارجية مع الصفوف، والحلقة الداخلية مع الأعمدة.
# مصفوفة 3x4 مملوءة بالأصفار
rows = 3
cols = 4
array_2d = [[0 for _ in range(cols)] for _ in range(rows)]
print(array_2d) # الإخراج: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
# مصفوفة 3x3 بقيم تعتمد على مؤشرات الصف والعمود
array_2d = [[i + j for j in range(3)] for i in range(3)]
print(array_2d) # الإخراج: [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
# مصفوفة 2x2 بأعداد عشوائية (يتطلب استيراد random)
import random
array_2d = [[random.randint(1,10) for _ in range(2)] for _ in range(2)]
print(array_2d) # الإخراج: (مثال) [[7, 2], [9, 5]]
طريقة الحلقات المتداخلة
يستخدم هذا الأسلوب حلقات for
متداخلة مع range
، ويتكرر عبر الصفوف والأعمدة لبناء المصفوفة عنصرًا عنصرًا. وهو أكثر تفصيلاً من التعبير القائم على القائمة، لكنه قد يكون أسهل للفهم للمبتدئين.
rows = 3
cols = 4
array_2d = []
for i in range(rows):
row = []
for j in range(cols):
row.append(0) # أو أي قيمة بدء أخرى
array_2d.append(row)
print(array_2d) # الإخراج: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
rows = 3
cols = 3
array_2d = []
for i in range(rows):
row = []
for j in range(cols):
row.append(i*cols + j) #مثال لملء المصفوفة بأعداد متسلسلة
array_2d.append(row)
print(array_2d) # الإخراج: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
مصفوفات NumPy
NumPy هي مكتبة قوية للحوسبة العددية في بايثون. توفر دالتها numpy.array()
إنشاءًا وتلاعبًا فعالين للمصفوفات متعددة الأبعاد. تقدم مصفوفات NumPy أداءً أسرع بكثير من قوائم بايثون للعمليات العددية.
import numpy as np
# مصفوفة 3x4 مملوءة بالأصفار
array_2d = np.zeros((3, 4))
print(array_2d)
# مصفوفة 3x3 مملوءة بالواحدات
array_2d = np.ones((3, 3))
print(array_2d)
# مصفوفة 2x2 مملوءة بقيمة محددة
array_2d = np.full((2, 2), 7)
print(array_2d)
# مصفوفة الوحدة 3x3
array_2d = np.eye(3)
print(array_2d)
# مصفوفة 2x3 بأعداد عشوائية بين 0 و 1
array_2d = np.random.rand(2, 3)
print(array_2d)
# مصفوفة 2x2 بأعداد صحيحة عشوائية بين 1 و 10
array_2d = np.random.randint(1, 11, size=(2,2))
print(array_2d)
توفر NumPy العديد من الدوال لتهيئة المصفوفات بقيم وأنماط متنوعة، مما يجعلها الخيار المفضل للحسابات العددية التي تتضمن مصفوفات ثنائية الأبعاد. تذكر أن تقوم بـ import numpy as np
قبل استخدام هذه الدوال.