برای ضرب ماتریس در پایتون روشهای مختلفی مانند استفاده از حلقه for به صورت تو در تو، نوشتن دستور «List Comprehension» یا استفاده از ابزارهای اختصاصی کتابخانه «NumPy» وجود دارند. ضرب ماتریسها یکی از اصلیترین عملیات مربوط به حل مسائل ریاضیات، فیزیک، مهندسی و علوم کامپیوتر است. به همین دلیل، برنامه نویسان حرفهای پایتون باید روش حل این دسته از مسائل را بلد باشند. به طور خاص برای انجام وظایف مربوط به جبر خطی، تبدیلهای گرافیکی و الگوریتمهای «یادگیری ماشین» (Machine Learning) این تکنیک به کار برده میشود. در این فرایند، دو ماتریس دریافت کرده و ماتریس جدیدی تولید میکنیم. ماتریس سوم، نتیجه حاصل ضرب دو ماتریس اول است.
آنچه در این مطلب میآموزید:
-
با ساختار ماتریس و شرطی اصلی برای امکان ضرب بین دو ماتریس آشنا میشوید.
-
یاد میگیرید که چطور با کمک حلقه for تو در تو ماتریسهای دوبعدی را در هم ضرب کنید.
-
روش استفاده از تکنیک List Comprehension تو در تو برای ضرب ماتریس را میآموزید.
-
میآموزید که چطور با به کار بردن متد multiply در NumPy ضرب ماتریس را حساب کنید.
-
روش استفاده از متدهای matmul و dot برای ضرب آرایه دوبعدی را یاد میگیرید.
-
روش ضرب آرایههای دوبعدی NumPy را با کمک عملگر @ میآموزید.



در این مطلب از مجله فرادرس، یاد میگیرید که چگونه با کمک پایتون دو ماتریس مختلف را در همدیگر ضرب کرده و نتیجه را محاسبه کنید. ابتدا تکنیکهای کدنویسی صریح با زبان برنامه نویسی پایتون را بررسی میکنیم. سپس روش استفاده از توابع پیشرفته کتابخانه NumPy را توضیح میدهیم.
ضرب ماتریس در پایتون چیست؟
ضرب ماتریس در پایتون به معنای استفاده از کدها برای انجام سریعتر و دقیق عملیات ضرب است. البته قبل از انجام این عملیات باید مطمئن شویم که ماتریسهای مورد نظر، معیارهای مربوط به ضرب ماتریسها را رعایت میکنند. یعنی اینکه تعداد ستونهای ماتریس اول باید با تعداد ردیفهای ماتریس دوم مساوی باشند.
در کادر پایین، دو ماتریس دلخواه با رعایت معیار مورد نظر تعریف کردهایم. این کد به زبان پایتون نوشته شده است.
ماتریس A از نوع ماتریسهای ۳×۲ و ماتریس B، یک ماتریس ۲×۳ است. اگر شرط بالا برقرار نباشد، امکان انجام عملیات ضرب بین این ماتریسها وجود ندارد.

اگر ماتریس X به شکل n x m باشد و ماتریس Y ساختاری به شکل m x l داشته باشد، آنگاه میتوانیم ماتریسهای X و Y را در یکدیگر ضرب کنیم. ابعاد ماتریس نتیجه به شکل n x l خواهد بود. فقط توجه کنید که عملیات ضرب ماتریسها قابل جابهجایی نیست. یعنی با اینکه ماتریسهای X و Y قابل ضرب هستند، اما نمیتوانیم ماتریسهای Y و X را در یکدیگر ضرب کنیم.
در این مطلب، ۶ روش اصلی را برای ضرب ماتریس در پایتون بررسی میکنیم. این موارد در فهرست پایین نام برده شدهاند.
- ضرب ماتریس در پایتون با کمک حلقههای تو در تو
- ضرب ماتریسها با کمک «List Comprehension» تو در تو
- ماتریس در پایتون با متد numpy.multiply()
- ضرب ماتریس در پایتون با متد numpy.matmul()
- ضرب ماتریس در پایتون با متد numpy.dot()
- ضرب ماتریس در پایتون با عملگر @
روشهای بالا را میتوان در دو گروه دستهبندی میشوند.
- استفاده از کدهای مستقیم پایتون و بدون کمک از ابزارهای جانبی
- استفاده از توابع اختصاصی تعریف شده در کتابخانه NumPy
تا اینجای مطلب با مفهوم ضرب ماتریسها و تکنیکهای پایتون برای محاسبه این عملیات ریاضی آشنا شدهاید. در ادامه این مطلب، تمام تکنیکهای معرفی شده را همراه با مثالهای کدنویسی شده بررسی میکنیم. در صورت تمایل به مطالعه این دست از مطالب، پیشنهاد میکنیم حتما از اپلیکیشن مجله فرادرس استفاده کنید.
برای نصب اپلیکیشن رایگان مجله فرادرس، کلیک کنید.
در ادامه هر کدام از این دستهبندیها را یک به یک توضیح دادهایم.
ضرب ماتریس با کمک کدهای مستقیم پایتون
در این بخش تکنیکهای انجام ضرب بدون کمک گرفتن از کتابخانههای تخصصی پایتون را بررسی میکنیم. در پایتون برای تعریف کردن ماتریسها میتوانیم آنها را به صورت لیستهای تو در تو بنویسیم. در لیست بیرونی هر عنصر مانند یک ردیف از ماتریس است.
برای مثال کد زیر نشان دهنده ماتریس ۲×۳ است.
برای انتخاب اولین ردیف از عبارت X[0] استفاده میکنیم. به همین صورت اگر بخواهیم اولین عنصر از اولین ردیف ماتریس را انتخاب کنیم باید عبارت خود را به شکل X[0][0] بنویسیم. حاصل ضرب ماتریسهای X و Y فقط به شرطی قابل محاسبه است که تعداد ستونهای ماتریس X با تعداد ردیفهای ماتریس Y برابر باشد.

برای انجام ضرب ماتریس در پایتون بدون استفاده از کتابخانهها و ابزارهای تخصصی این زبان، دو روش رایج وجود دارد.
- ضرب دو ماتریس با کمک حلقههای تو در تو
- ضرب دو ماتریس با کمک تکنیک List Comprehension به صورت تو در تو
در ادامه این قسمت، هر دو روش را بررسی میکنیم.
ضرب ماتریس در پایتون با کمک حلقههای تو در تو
از آنجا که در پایتون برای تعریف ماتریس از لیستهای تو در تو استفاده میکنیم با کمک حلقههای تو در تو هم میتوانیم بر روی تمام عناصر ماتریس پیمایش کنیم. ابتدا با کمک مثال سادهای روش پیادهسازی این ضرب را بررسی میکنیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
در برنامه بالا برای پیمایش بر روی عناصر تمام ردیفها و ستونهای ماتریسها از حلقه های پایتون به صورت تو در تو استفاده کردهایم. سپس مجموع حاصل ضربها را در متغیر result جمع کردیم.
پیادهسازی این تکنیک بسیار ساده است. اما همزمان با بزرگتر شدن ماتریسها (از لحاظ پردازشی) بسیار پرهزینه و کند میشود. برای انجام عملیات ضرب بر روی ماتریسهای بزرگتر بهتر است از پکیجهای نرمافزاری بهینهسازی شدهای مانند NumPy استفاده کنید. NumPy نسبت به کد بالا بسیار سریعتر کار میکند. میتوان گفت حدود ۱۰۰۰ برابر سریعتر این محاسبات را انجام میدهد. در بخشهای بعدی مطلب، روشهای انجام ضرب با کمک NumPy را هم توضیح دادهایم.
ضرب ماتریس ها با کمک List Comprehension تو در تو
در این تکنیک برای پیمایش بر روی یک به یک عناصر ماتریسها از List Comprehension به صورت تو در تو استفاده میکنیم. این کد در نگاه اول پیچیده و ناخوانا به نظر میرسد. اما به محض آشنا شدن با روش کار تکنیک List Comprehension، به راحتی این روش را درک میکنید. حتی ممکن است که دیگر از حلقههای تو در تو استفاده نکنید.
بعد از اجرای کدهای بالا، خروجی به شکل زیر تولید شده و در کنسول پایتون نمایش داده میشود.
[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]
خروجی برنامه بالا هم مانند خروجی کد قبلی است. برای اجرای بهتر عملیات در کد بالا از تابع zip() و آرگومان *Y استفاده کردهایم. برای آشنایی با ساختار آرگومانهای args* و kwargs** در پایتون، پیشنهاد میکنیم که مطلب مربوط به آنها را در مجله فرادرس مطالعه کنید.
چطور برنامه نویسی حرفهای پایتون را یاد بگیریم؟
پایتون زبان چندکاره و قدرتمندی است. برای همین به یکی از پرکاربردترین زبانهای برنامه نویسی در دنیا تبدیل شده است. افراد زیادی برای رسیدن به موقعیتهای شغلی در حوزه هوش مصنوعی و علم داده، زمان و انرژی خود را در راه یادگیری پایتون مصرف میکنند. از طرف دیگر، سینتکس ساده پایتون یادگیری آن را راحتتر هم کرده است. البته آموزش مراحل پیشرفته به استفاده از منابع قوی و اساتید باتجربه نیاز دارد. به همین دلیل، انتخاب منبع درست، برای یادگیری مفاهیم پایتون ضروری است. وبسایت فرادرس بهترین منابع را برای آموزش پایتون فراهم کرده است.

فرادرس در حوزه تولید محتوای آموزشی آنلاین متخصص است. زبان برنامه نویسی پایتون یکی از محبوبترین دورههای آموزشی این وبسایت است. مطالب و فیلمهای آموزشی با کیفیتی در فرادرس برای پایتون تولید شدهاند. فیلمهای فرادرس، مطالب پیشرفته پایتون را با زبانی ساده و حرفهای به مخاطبان آموزش دهند. استفاده از فیلمهای فرادرس یکی از مقرونبهصرفهترین روشها برای آموزش پایتون است. در فهرست پایین، چند مورد از فیلمهای آموزش پایتون را معرفی کردهایم.
ضرب ماتریس در پایتون با کمک NumPy
برای ضرب ماتریس در پایتون با کمک NumPy، چهار روش اصلی وجود دارند. این روشها را در فهرست زیر نام بردهایم.
- متد multiply(): این متد برای ضرب ماتریس درایهای یا یک به یک عناصر با همدیگر به کار برده میشود.
- متد matmul(): از این متد برای محاسبه ماتریس حاصلضرب دو آرایه مختلف استفاده میکنیم.
- متد dot(): این متد، حاصل ضرب نقطهای دو آرایه را به دست میآورد.
- عملگر @: این عملگر نیز مانند matmul() برای به دست آوردن ماتریس حاصلضرب آرایهها استفاده میشود.

در زمینه عملیات ریاضی و عددی، NumPy یکی از قدرتمندترین کتابخانههای پایتون است. تمام افرادی که میخواهند در حوزههایی مانند علم داده، هوش مصنوعی، یادگیری ماشین، محاسبات عددی و غیره با پایتون برنامه نویسی کنند، باید روش کار با NumPy را بلد باشند. در صورت تمایل به یادگیری کار با این کتابخانه پیشنهاد میکنیم فیلم آموزش رایگان عملیات روی مجموعه ها در کتابخانه NumPy برای محاسبات علمی در پایتون را در فرادرس مشاهده کنید. لینک مربوط به آن را در پایین نیز قرار دادهایم.
در ادامه تمام تکنیکهای بالا را یک به یک بررسی میکنیم.
ضرب ماتریس در پایتون با متد multiply
اگر بخواهیم از تکنیک ضرب ماتریس درایهای استفاده کنیم، باید تابع multiply() را به کار ببریم.
بعد از اجرای کدهای بالا خروجی زیر در کنسول پایتون نمایش داده میشود.
ضرب ماتریس در پایتون با متد matmul
برای محاسبه حاصل ضرب ماتریسهایی که در قالب آرایههای NumPy نوشته شدهاند، باید از متد matmul() استفاده بکنیم.
بعد از اجرای کدهای بالا خروجی زیر در کنسول پایتون نمایش داده میشود.
Matrix Product of arr1 and arr2 is:
[[19 22]
[43 50]]
Matrix Product of arr2 and arr1 is:
[[23 34]
[31 46]]
در تصویر پایین، نحوه محاسبه روش حاصل ضرب ماتریس برای تمام اندیسهای آرایه arr_result نشان داده شده است. به منظور راحتتر شدن مطلب، ردیف را از آرایه اول و ستون را از آرایه دوم انتخاب میکنیم. با ضرب عناصر متناظر در این ساختارها و جمع بستن حاصل ضرب مقدار یک به یک اندیسهای آرایه arr_result به دست میآیند.

شکل نهایی ماتریس به دست آمده از ضرب دو آرایه به جایگاه دقیق آرگومانهای مختلف آنها مرتبط است. بنابراین نتیجه تابع matmul(A, B) ممکن است با نتیجه اجرای تابع matmul(B, A) تفاوت داشته باشد.
ضرب ماتریس در پایتون با متد dot
تابع dot() در NumPy نتیجه «ضرب نقطهای» (Dot Product) آرایهها را برمیگرداند. برای آرایههای یکبعدی و دوبعدی، نتیجه این تابع همان نتیجهی تابع matmul() است.
بعد از اجرای کدهای بالا خروجی زیر در کنسول پایتون نمایش داده میشود.
Dot Product of arr1 and arr2 is:
[[19 22]
[43 50]]
Dot Product of arr2 and arr1 is:
[[23 34]
[31 46]]
Dot Product of two 1-D arrays is:
17
ضرب ماتریس در پایتون با عملگر @
به ضرب در NumPy، «بردارسازی» (Vectorization) هم گفته میشود. هدف اصلی این تکنیک، کاهش یا حذف حلقههای for در برنامه است. با این روش، سرعت پردازش در کامپیوتر بیشتر میشود.

یکی از دیگر تکنیکهای مناسب برای ضرب ماتریس در NumPy استفاده از عملگر @ است. روش استفاده از این تکنیک در کادر زیر، نشان داده شده است.
بعد از اجرای کدهای بالا خروجی زیر در کنسول پایتون نمایش داده میشود.
[[ 63 320 83]
[ 77 484 102]
[ 84 248 117]]
در مثال بالا از ضرب نقطهای (Dot Product) استفاده کردهایم. در ریاضیات، ضرب نقطهای عملیاتی است که روی دو بردار هماندازه انجام میشود. در این روش، عناصر متناظر دو بردار در هم ضرب شده و سپس حاصل ضربها با هم جمع میشوند. در نهایت یک عدد به عنوان نتیجه به دست میآید.
یادگیری پایتون با کمک پیاده سازی پروژه در فرادرس
زبان برنامه نویسی پایتون، در حوزههایی مثل هوش مصنوعی، امنیت سایبری و غیره کاربردهای گستردهای دارد. در نتیجه، فرصتهای شغلی زیادی برای برنامه نویسان آن به وجود آمده است. البته برای رسیدن به این موقعیتهای شغلی، برنامه نویسان پایتون باید در کار با مفاهیم پیشرفته این زبان هم حرفهای شوند. بهترین روش برای تقویت این مهارتها، استفاده از آنها در اجرای پروژههای واقعی است. فرادرس به عنوان بزرگترین و حرفهایترین تولیدکننده فیلمهای آموزشی به زبان فارسی، فیلمهای پروژهمحور زیادی برای پایتون طراحی و منتشر کرده است.
استفاده از این فیلمها علاوه بر کسب تجربه واقعی برای برنامه نویسان، رزومه مناسبی هم برای آنان ایجاد میکند. در پایین، چند مورد از فیلمهای آموزشی پروژهمحور پایتون را معرفی کردهایم.
برای مشاهده فیلمهای بیشتر بر روی تصویر زیر کلیک کرده و به صفحه اصلی این مجموعه آموزشی هدایت شوید.

جمعبندی
در این مطلب از مجله فرادرس، روش محاسبه ضرب ماتریس در پایتون را بررسی کردهایم. این تکنیک یکی از عملیات پایه در ریاضیات و علوم کامپیوتر است. زیرا در مسائلی مانند جبر خطی، پردازش گرافیکی و یادگیری ماشین کاربرد دارد. از آنجا که پایتون به زبانی بسیار مهم در حوزه انجام محاسبات علمی و طراحی مدلهای هوش مصنوعی تبدیل شده، برنامه نویسان نیز پایتون بهتر است روش حل این مسائل را بلد باشند. برای انجام ضرب ماتریسی باید ابعاد ماتریسها مناسب باشند. یعنی تعداد ستونهای ماتریس اول با تعداد ردیفهای ماتریس دوم برابر باشد.
روشهای مختلفی در پایتون برای ضرب ماتریس وجود دارد. برای مثال میتوان به استفاده از حلقههای تو در تو، List Comprehension و کتابخانه NumPy اشاره کرد. پیادهسازی این عملیات با کمک حلقهها و List Comprehension ساده است اما برای ماتریسهای بزرگ کند عمل میکند. کتابخانه NumPy با توابعی مانند multiply() و matmul() و dot() و عملگر @ عملیات ضرب را سریعتر و به شکل بهینه انجام میدهد. این متدها علاوه بر سرعت، دقت بالایی دارند، به طوری که حلقههای تکراری حذف شده و محاسبات روی آرایهها با سرعت خیلی بیشتری انجام میشوند.
source
