يعد ضرب المصفوفة عملية أساسية في الجبر الخطي.
نستخدمه بشكل عام في العديد من التطبيقات مثل معالجة الصور والتعلم الآلي وغيرها الكثير. NumPy هي حزمة بايثون بارزة للحوسبة العلمية.
ومع ذلك ، في هذا المنشور ، سننظر في طرق مختلفة للقيام بضرب المصفوفة في Python دون استخدام NumPy.
سوف نستخدم حلقات متداخلة، وظيفة الخريطة () المضمنة ، وقائمة الفهم.
بالإضافة إلى ذلك ، سوف ننظر في مزايا وعيوب كل استراتيجية ، وكذلك متى يتم تطبيق كل منها. إذا كنت جديدًا في الجبر الخطي وتريد معرفة المزيد عن ضرب المصفوفة ؛ استمر في القراءة.
أين نستخدم مصفوفة ضرب؟
يستخدم ضرب المصفوفة في رسومات الحاسوب لتغيير المرئيات ثنائية وثلاثية الأبعاد. على سبيل المثال ، يمكنك تدوير الكائنات على الشاشة وقياسها وترجمتها. تُستخدم المصفوفات في معالجة الصور لتمثيل الصور كمصفوفات من وحدات البكسل. إلى جانب ذلك ، يمكن استخدام المصفوفات لإجراء عمليات مثل تصفية الصور.
نحن أيضًا نستخدم المصفوفات في آلة التعلم. يمكنهم مساعدتنا في تمثيل البيانات ومعلمات النموذج. يمكننا إجراء العديد من العمليات ، مثل حساب المنتجات النقطية ومنتجات المصفوفة المتجهة.
بالتأكيد ، هذه العملية مفيدة للغاية أيضًا في العمليات العلمية. يمكننا استخدامه في الفيزياء والهندسة لوصف الكميات الفيزيائية. ومن ثم ، يمكننا العمل بالمتجهات والموترات.
لماذا قد لا نختار استخدام NumPy؟
بينما NumPy هو ملف مكتبة بايثون، فهو ليس دائمًا الخيار المثالي لضرب المصفوفة. قد لا نختار استخدام NumPy لأسباب مثل الحجم والتبعية والتعلم والأنظمة القديمة.
قد يكون استخدام وظائف Python المضمنة أو تطوير رمز مخصص أكثر كفاءة في بعض الحالات. من المهم أن نلاحظ ، مع ذلك ، أن NumPy هي مكتبة قوية. إلى جانب ذلك ، يمكنك أيضًا استخدامه لضرب المصفوفة.
الآن ، دعنا نلقي نظرة على كيفية تحقيق ضرب المصفوفة بدون NumPy.
طريقة الحلقات المتداخلة
تستخدم تقنية الحلقات المتداخلة حلقات متداخلة لتنفيذ ضرب المصفوفة في بايثون. تتكرر الدالة على كل عنصر مصفوفة. وتقوم بضربها باستخدام سلسلة من الحلقات المتداخلة. تقوم الدالة بإرجاع النتيجة المخزنة في مصفوفة جديدة.
هذا النهج سهل الفهم. ومع ذلك ، قد لا تكون فعالة مثل الطرق الأخرى ، خاصة بالنسبة لمصفوفات أكبر. ومع ذلك ، فهو خيار رائع بالنسبة لك إذا كنت جديدًا في الجبر الخطي.
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# اضبط مصفوفة النتيجة على أصفار.
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
دعنا نحصل على مثال عن كيفية القيام بذلك. يمكنك فقط إضافة هذه الأسطر من التعليمات البرمجية أدناه لاختبار هذا المثال.
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
الفوائد :
- سهل الفهم.
- عظيم للمبتدئين أو أولئك الذين يسعون إلى فهم أعمق لضرب المصفوفة.
العيوب:
- ليست فعالة مثل التقنيات البديلة ، خاصة بالنسبة للمصفوفات الأكبر.
- إنه ليس مقروءًا مثل الطرق البديلة.
طريقة الوظيفة map ()
توفر طريقة دالة map () طريقة بديلة للقيام بضرب المصفوفة في Python. في هذا النهج ، نستخدم وظيفة الخريطة () المضمنة. ومن ثم ، فإننا نستخدم أداة برمجة وظيفية تطبق وظيفة متوفرة على كل عنصر قابل للتكرار (قائمة ، بنية ، إلخ). أيضًا ، تقبل الدالة map () معلمتين ، دالة وقابلة للتكرار. وتقوم بإرجاع مكرر يقوم بتطبيق الوظيفة على كل عنصر قابل للتكرار.
في هذا النهج ، نتصفح كل عضو في المصفوفة ونقوم بعملية الضرب باستخدام دالة map () المتداخلة.
تُستخدم الدالة zip () للتكرار خلال كل عنصر من عناصر المصفوفات على التوازي.
أخيرًا ، تُستخدم وظيفة sum () لجمع النتائج.
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
الآن ، مرة أخرى ، يمكننا اختبار الكود الخاص بنا بمثال.
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
المزايا
- أكثر فعالية من نهج الحلقات المكدسة
- يستخدم البرمجة الوظيفية لجعل الكود أبسط.
عيوب
- قد يجد بعض الأشخاص الذين ليسوا على دراية بالبرمجة الوظيفية أنها أقل قابلية للقراءة.
- إنها أقل قابلية للفهم من تقنية الحلقات المتداخلة.
طريقة فهم القائمة
يمكّنك فهم القائمة من إنشاء قائمة جديدة في سطر واحد من التعليمات البرمجية. ومن ثم ، يتم ذلك من خلال تطبيق تعبير على كل عضو في قائمة موجودة.
في هذا النهج ، يتم إجراء الضرب عن طريق التكرار المتكرر عبر كل عضو مصفوفة. نحن نستخدم قائمة الفهم ذات الطبقات.
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
المميزات
- بالمقارنة مع طريقة وظيفة map () ، أقصر وأكثر قابلية للقراءة.
عيوب
- قد يكون أقل فاعلية من استخدام دالة map () ، خاصة للمصفوفات الكبيرة.
- إنه أكثر صعوبة من نهج الحلقات المتداخلة.
وفي الختام
في هذا المنشور ، نظرنا في بدائل لاستخدام NumPy عند ضرب المصفوفات في Python. قمنا بضرب المصفوفة في حلقات متداخلة ، ووظيفة map () المضمنة ، وفهم القائمة.
ستعتمد أفضل استراتيجية على الاحتياجات الخاصة لمشروعك.
كل استراتيجية لها إيجابيات وسلبيات خاصة بها. للتأكد من أن الوظيفة تعمل بشكل صحيح ، من الجيد إضافة بعض حالات الاختبار بأبعاد وقيم مصفوفة مختلفة.
يجب عليك أيضًا تضمين بعض اختبارات الأداء لمقارنة مدى جودة تنفيذ هذه الأساليب.
اترك تعليق