3 начина за множење матрица у Питхон-у

У овом водичу ћете научити како да помножите две матрице у Питхон-у.

Почећете тако што ћете научити услове за важеће множење матрице и написати прилагођену Питхон функцију за множење матрица. Затим ћете видети како можете постићи исти резултат користећи угнежђене листе разумевања.

Коначно, наставићете да користите НумПи и његове уграђене функције да бисте ефикасније извршили множење матрице.

Како проверити да ли је множење матрице важеће

Пре него што напишемо Питхон код за множење матрица, хајде да се вратимо на основе множења матрице.

Множење матрице између две матрице А и Б важи само ако је број колона у матрици А једнак броју редова у матрици Б.

Вероватно бисте раније наишли на овај услов за множење матрице. Међутим, да ли сте се икада запитали зашто је то тако?

Па, то је због начина на који функционише множење матрице. Погледајте слику испод.

У нашем генеричком примеру, матрица А има м редова и н колона. А матрица Б има н редова и п колона.

Какав је облик матрице производа?

Елемент са индексом (и, ј) у резултантној матрици Ц је тачкасти производ реда и матрице А и колоне ј матрице Б.

Дакле, да бисте добили елемент са одређеним индексом у резултујућој матрици Ц, мораћете да израчунате тачкасти производ одговарајућег реда и колоне у матрицама А и Б, респективно.

Понављајући горњи поступак, добићете матрицу производа Ц облика мкп—са м редова и п колона, као што је приказано испод.

А тачкасти производ или унутрашњи производ између два вектора а и б је дат следећом једначином.

Хајде да сумирамо сада:

  • Очигледно је да је тачкасти производ дефинисан само између вектора једнаке дужине.
  • Дакле, да би тачкасти производ између реда и колоне био валидан—када множите две матрице—требало би да обе имају исти број елемената.
  • У горњем генеричком примеру, сваки ред у матрици А има н елемената. И свака колона у матрици Б такође има н елемената.

Ако боље погледате, н је број колона у матрици А, а такође је и број редова у матрици Б. И управо је то разлог зашто вам треба да број колона у матрици А буде једнак броју редова у матрици Б.

Надам се да разумете услов да множење матрице буде валидан и како да добијете сваки елемент у матрици производа.

  Како поправити Блуетоотх аудио у Цхроме претраживачу

Хајде да наставимо да пишемо неки Питхон код за множење две матрице.

Напишите прилагођену Питхон функцију за множење матрица

Као први корак, напишимо прилагођену функцију за множење матрица.

Ова функција треба да уради следеће:

  • Прихватите две матрице, А и Б, као улазе.
  • Проверите да ли је множење матрице између А и Б важеће.
  • Ако је валидно, помножите две матрице А и Б и вратите матрицу производа Ц.
  • У супротном, вратите поруку о грешци да се матрице А и Б не могу помножити.

Корак 1: Генеришите две матрице целих бројева помоћу функције НумПи рандом.рандинт(). Такође можете декларисати матрице као угнежђене Питхон листе.

import numpy as np
np.random.seed(27)
A = np.random.randint(1,10,size = (3,3))
B = np.random.randint(1,10,size = (3,2))
print(f"Matrix A:n {A}n")
print(f"Matrix B:n {B}n")

# Output
Matrix A:
 [[4 9 9]
 [9 1 6]
 [9 2 3]]

Matrix B:
 [[2 2]
 [5 7]
 [4 4]]

Корак 2: Наставите и дефинишите функцију мултипли_матрик(А,Б). Ова функција узима две матрице А и Б као улазе и враћа матрицу производа Ц ако је множење матрице важеће.

def multiply_matrix(A,B):
  global C
  if  A.shape[1] == B.shape[0]:
    C = np.zeros((A.shape[0],B.shape[1]),dtype = int)
    for row in range(rows): 
        for col in range(cols):
            for elt in range(len(B)):
              C[row, col] += A[row, elt] * B[elt, col]
    return C
  else:
    return "Sorry, cannot multiply A and B."

Рашчлањивање дефиниције функције

Хајде да наставимо са рашчлањивањем дефиниције функције.

Објавите Ц као глобалну променљиву: Подразумевано, све променљиве унутар Питхон функције имају локални опсег. И не можете им приступити изван функције. Да би матрица производа Ц била доступна споља, мораћемо да је декларишемо као глобалну променљиву. Само додајте глобални квалификатор пре имена променљиве.

Проверите да ли је множење матрице важеће: Користите атрибут облика да бисте проверили да ли се А и Б могу помножити. За било који низ арр, арр.схапе[0] и арр.облик[1] дати број редова и колона, респективно. Дакле, ако А.облик[1] == Б.облик[0] проверава да ли је множење матрице валидно. Само ако је овај услов Тачан, матрица производа ће бити израчуната. У супротном, функција враћа поруку о грешци.

Користите угнежђене петље за израчунавање вредности: Да бисмо израчунали елементе резултујуће матрице, морамо да прођемо кроз редове матрице А, а спољна фор петља то ради. Унутрашња фор петља нам помаже да прођемо кроз колону матрице Б. А најдубља фор петља помаже приступ сваком елементу у изабраној колони.

▶ Сада када смо научили како функционише Питхон функција за множење матрица, позовимо функцију са матрицама А и Б које смо раније генерисали.

multiply_matrix(A,B)

# Output
array([[ 89, 107],
       [ 47,  49],
       [ 40,  44]])

Пошто је множење матрице између А и Б важеће, функција мултипли_матрик() враћа матрицу производа Ц.

Користите Питхон угнежђену листу разумевања за множење матрица

У претходном одељку написали сте Питхон функцију за множење матрица. Сада ћете видети како можете да користите угнежђене листе разумевања да урадите исто.

  Покрените апликације и позовите из иПхоне центра за обавештења

Ево разумевања угнежђене листе за множење матрица.

У почетку, ово може изгледати компликовано. Али ми ћемо рашчланити разумевање угнежђене листе корак по корак.

Хајде да се фокусирамо на једно по једно разумевање листе и идентификујемо шта оно ради.

Користићемо следећи општи шаблон за разумевање листе:

[<do-this> for <item> in <iterable>]

where,
<do-this>: what you'd like to do—expression or operation
<item>: each item you'd like to perform the operation on
<iterable>: the iterable (list, tuple, etc.) that you're looping through

▶ Погледајте наш водич Разумевање листе у Питхон-у – са примерима да бисте стекли дубинско разумевање.

Пре него што наставите, имајте на уму да бисмо желели да направимо резултујућу матрицу Ц ред по ред.

Објашњено разумевање угнежђене листе

Корак 1: Израчунајте једну вредност у матрици Ц

Дати ред и матрице А и колону ј матрице Б, доњи израз даје унос на индексу (и, ј) у матрици Ц.

sum(a*b for a,b in zip(A_row, B_col)

# zip(A_row, B_col) returns an iterator of tuples
# If A_row = [a1, a2, a3] & B_col = [b1, b2, b3]
# zip(A_row, B_col) returns (a1, b1), (a2, b2), and so on

Ако је и = ј = 1, израз ће вратити унос ц_11 матрице Ц. Дакле, на овај начин можете добити један елемент у једном реду.

Корак 2: Направите један ред у матрици Ц

Наш следећи циљ је да изградимо цео ред.

За ред 1 у матрици А, морате да прођете кроз све колоне у матрици Б да бисте добили један комплетан ред у матрици Ц.

Вратите се на шаблон за разумевање листе.

  • Замените <уради-ово> изразом из корака 1, јер то желите да урадите.
  • Затим замените <итем> са Б_цол—свака колона у матрици Б.
  • Коначно, замените <итерабле> са зип(*Б)—листом која садржи све колоне у матрици Б.

И ево првог разумевања листе.

[sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B)] 

# zip(*B): * is the unzipping operator
# zip(*B) returns a list of columns in matrix B

Корак 3: Направите све редове и добијте матрицу Ц

Затим ћете морати да попуните матрицу производа Ц тако што ћете израчунати остатак редова.

А за ово, морате проћи кроз све редове у матрици А.

Вратите се поново на разумевање листе и урадите следеће.

  • Замените <уради-ово> са разумевањем листе из корака 2. Подсетите се да смо у претходном кораку израчунали цео ред.
  • Сада замените <итем> са А_ров—сваки ред у матрици А.
  • А ваш <итерабле> је сама матрица А, док се крећете кроз њене редове.

А ево нашег коначног разумевања угнежђене листе.🎊

[[sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B)] 
    for A_row in A]

Време је да проверите резултат! ✔

# cast into <a href="https://techblog.co.rs.com/numpy-reshape-arrays-in-python/">NumPy array</a> using np.array()
C = np.array([[sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B)] 
    for A_row in A])

# Output:
[[ 89 107]
 [ 47  49]
 [ 40  44]]

Ако боље погледате, ово је еквивалентно угнежђеним фор петљама које смо имали раније – само што је сажетије.

Ово такође можете учинити још ефикасније користећи неке уграђене функције. Хајде да научимо о њима у следећем одељку.

Користите НумПи матмул() за множење матрица у Питхон-у

нп.матмул() узима две матрице као улаз и враћа производ ако је множење матрице између улазних матрица валидно.

C = np.matmul(A,B)
print(C)

# Output:
[[ 89 107]
 [ 47  49]
 [ 40  44]]

Обратите пажњу на то како је овај метод једноставнији од две методе које смо раније научили. У ствари, уместо нп.матмул(), можете користити еквивалентни @ оператор, и то ћемо одмах видети.

Како користити @ оператор у Питхон-у за множење матрица

У Питхон-у, @ је бинарни оператор који се користи за множење матрице.

Он ради са две матрице, и уопште, Н-димензионалним НумПи низовима, и враћа матрицу производа.

Напомена: Морате да имате Питхон 3.5 и новије верзије да бисте користили оператор @.

Ево како га можете користити.

C = [email protected]
print(C)

# Output
array([[ 89, 107],
       [ 47,  49],
       [ 40,  44]])

Приметите да је матрица производа Ц иста као и она коју смо раније добили.

Можете ли користити нп.дот() за множење матрица?

Ако сте икада наишли на код који користи нп.дот() за множење две матрице, ево како то функционише.

C = np.dot(A,B)
print(C)

# Output:
[[ 89 107]
 [ 47  49]
 [ 40  44]]

Видећете да нп.дот(А, Б) такође враћа очекивану матрицу производа.

Међутим, према пер НумПи доцстребало би да користите нп.дот() само за израчунавање тачкастог производа два једнодимензионална вектора, а не за множење матрице.

Подсетимо се из претходног одељка, елемент на индексу (и, ј) матрице производа Ц је тачкасти производ реда и матрице А и колоне ј матрице Б.

Како НумПи имплицитно емитује ову операцију тачкастог производа на све редове и све колоне, добијате резултујућу матрицу производа. Али да би ваш код био читљив и избегли двосмисленост, уместо тога користите нп.матмул() или @ оператор.

Закључак

🎯 У овом водичу сте научили следеће.

  • Услов да би множење матрице био валидан: број колона у матрици А = број редова у матрици Б.
  • Како написати прилагођену Питхон функцију која проверава да ли је множење матрице важеће и враћа матрицу производа. Тело функције користи угнежђене за петље.
  • Затим сте научили како да користите угнежђене листе разумевања за множење матрица. Они су сажетији него за петље, али су склони проблемима у читљивости.
  • Коначно, научили сте да користите НумПи уграђену функцију нп.матмул() за множење матрица и како је ово најефикасније у смислу брзине.
  • Такође сте научили о @ оператору за множење две матрице у Питхон-у.

И то завршава нашу дискусију о множењу матрица у Питхон-у. Као следећи корак, научите како да проверите да ли је број прост у Питхон-у. Или решите занимљиве проблеме на Питхон стринговима.

Срећно учење!🎉