Neste tutorial, você aprenderá como multiplique duas matrizes em Python.
Você começará aprendendo a condição para multiplicação de matriz válida e escreverá uma função Python personalizada para multiplicar matrizes. A seguir, você verá como pode obter o mesmo resultado usando compreensão de lista aninhada.
Por fim, você continuará a usar NumPy e suas funções integradas para executar a multiplicação de matrizes com mais eficiência.
Como verificar se a multiplicação de matrizes é válida
Antes de escrever o código Python para multiplicação de matrizes, vamos revisitar os fundamentos da multiplicação de matrizes.
A multiplicação de matrizes entre duas matrizes A e B só é válida se a numero de colunas na matriz A é igual para o numero de linhas na matriz B.
Você provavelmente já encontrou essa condição para multiplicação de matrizes antes. No entanto, você já se perguntou por que isso acontece?
Bem, é por causa da forma como a multiplicação de matrizes funciona. Dê uma olhada na imagem abaixo.
Em nosso exemplo genérico, a matriz A tem m linhas e n colunas. E a matriz B tem n linhas e p colunas.
Qual é a forma da matriz de produtos?
O elemento no índice (i, j) na matriz resultante C é o produto escalar da linha i da matriz A e da coluna j da matriz B.
Portanto, para obter um elemento em um determinado índice na matriz resultante C, você terá que calcular o produto escalar da linha e coluna correspondentes nas matrizes A e B, respectivamente.
Repetindo o processo acima, você obterá a matriz de produto C da forma mxp -com m linhas e p colunas, como mostrado abaixo.

E o produto escalar ou o produto interno entre dois vetores a e b é dada pela seguinte equação.

Vamos resumir agora:
- É evidente que o produto escalar é definido apenas entre vetores de igual comprimento.
- Portanto, para que o produto escalar entre uma linha e uma coluna seja válido – ao multiplicar duas matrizes – você precisa que ambas tenham o mesmo número de elementos.
- No exemplo genérico acima, cada linha na matriz A tem n elementos. E cada coluna na matriz B tem n elementos também.
Se você olhar mais de perto, n é o número de colunas na matriz A, e é também o número de linhas na matriz B. E esta é precisamente a razão pela qual você precisa do numero de colunas na matriz A ser igual para o numero de linhas na matriz B.
Espero que você entenda a condição para que a multiplicação da matriz seja válida e como obter cada elemento na matriz do produto.
Vamos escrever algum código Python para multiplicar duas matrizes.
Escreva uma função Python personalizada para multiplicar matrizes
Como primeiro passo, vamos escrever uma função personalizada para multiplicar matrizes.
Esta função deve fazer o seguinte:
- Aceite duas matrizes, A e B, como entradas.
- Verifique se a multiplicação de matrizes entre A e B é válida.
- Se válido, multiplique as duas matrizes A e B e retorne a matriz produto C.
- Caso contrário, retorne uma mensagem de erro informando que as matrizes A e B não podem ser multiplicadas.
Passo 1 : Gere duas matrizes de números inteiros usando NumPy’s random.randint()
função. Você também pode declarar matrizes como listas Python aninhadas.
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))
Passo 2: Vá em frente e defina a função multiply_matrix(A,B)
. Esta função leva em duas matrizes A
e B
como entradas e retorna a matriz do produto C
se a multiplicação de matrizes for válida.
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."
Analisando a definição da função
Vamos analisar a definição da função.
Declarar C como uma variável global : Por padrão, todas as variáveis dentro de uma função Python têm escopo local. E você não pode acessá-los de fora da função. Para tornar a matriz de produto C acessível de fora, teremos que declará-la como uma variável global. Basta adicionar o global
qualificador antes do nome da variável.
Verifique se a multiplicação de matrizes é válida: Use o shape
atributo para verificar se A e B podem ser multiplicados. Para qualquer matriz arr
, arr.shape(0)
e arr.shape(1)
dar o número de linhas e colunas, respectivamente. Então if A.shape(1) == B.shape(0)
verifica se a multiplicação de matrizes é válida. Somente se esta condição for True
, a matriz do produto será calculada. Caso contrário, a função retornará uma mensagem de erro.
Use loops aninhados para calcular valores: Para calcular os elementos da matriz resultante, temos que percorrer as linhas da matriz A, e o exterior for
loop faz isso. O interior for
loop nos ajuda a percorrer a coluna da matriz B. E o mais interno for
loop ajuda a acessar cada elemento na coluna selecionada.
▶️ Agora que já aprendemos como funciona a função Python para multiplicar matrizes, vamos chamar a função com as matrizes A e B que geramos anteriormente.
multiply_matrix(A,B)
# Output
array((( 89, 107),
( 47, 49),
( 40, 44)))
Como a multiplicação de matrizes entre A e B é válida, a função multiply_matrix()
retorna a matriz produto C.
Use a compreensão de lista aninhada do Python para multiplicar matrizes
Na seção anterior, você escreveu uma função Python para multiplicar matrizes. Agora, você verá como pode usar as compreensões de lista aninhada para fazer o mesmo.
Aqui está a compreensão da lista aninhada para multiplicar matrizes.

A princípio, isso pode parecer complicado. Mas analisaremos a compreensão da lista aninhada passo a passo.
Vamos nos concentrar na compreensão de uma lista por vez e identificar o que ela faz.
Usaremos o seguinte modelo geral para compreensão de lista:
(<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
▶️ Confira nosso guia Compreensão de lista em Python – com exemplos para obter uma compreensão profunda.
Antes de prosseguir, observe que gostaríamos de construir a matriz resultante C uma linha de uma vez.
Compreensão de lista aninhada explicada
Passo 1: Calcular um único valor na matriz C
Dada a linha i da matriz A e a coluna j da matriz B, a expressão abaixo fornece a entrada no índice (i, j) na matriz C.
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
Se i = j = 1
a expressão retornará a entrada c_11
da matriz C. Portanto, você pode obter um elemento em uma linha dessa maneira.
Passo 2: Construir uma linha na matriz C
Nosso próximo objetivo é construir uma linha inteira.
Para a linha 1 na matriz A, você deve percorrer todas as colunas da matriz B para obter uma linha completa na matriz C.
Volte para o modelo de compreensão de lista.
- Substituir
<do-this>
com a expressão do passo 1, porque é isso que você quer fazer. - Em seguida, substitua
<item>
comB_col
— cada coluna na matriz B. - Finalmente, substitua
<iterable>
comzip(*B)
— a lista contendo todas as colunas na matriz B.
E aqui está a primeira compreensão da lista.
(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
Etapa 3: Construir todas as linhas e obter a matriz C
Em seguida, você terá que preencher a matriz de produto C calculando o restante das linhas.
E para isso, você deve percorrer todas as linhas da matriz A.
Volte para a compreensão da lista mais uma vez e faça o seguinte.
- Substituir
<do-this>
com a compreensão de lista da etapa 2. Lembre-se de que calculamos uma linha inteira na etapa anterior. - Agora, substitua
<item>
comA_row
—todas as linhas da matriz A. - e seu
<iterable>
é a própria matriz A, conforme você percorre suas linhas.
E aqui está nossa compreensão final da lista aninhada.
((sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B))
for A_row in A)
É hora de verificar o resultado! ✔
# cast into <a href="https://tecnologico.online/numpy-reshape-como-remodelar-matrizes-numpy-em-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))
Se você der uma olhada mais de perto, isso é equivalente aos loops for aninhados que tivemos anteriormente – só que é mais sucinto.
Você também pode fazer isso com mais eficiência usando algumas funções internas. Vamos aprender sobre eles na próxima seção.
Use NumPy matmul () para multiplicar matrizes em Python
O np.matmul()
recebe duas matrizes como entrada e retorna o produto se a multiplicação de matrizes entre as matrizes de entrada for válido.
C = np.matmul(A,B)
print(C)
# Output:
(( 89 107)
( 47 49)
( 40 44))
Observe como esse método é mais simples do que os dois métodos que aprendemos anteriormente. Na verdade, em vez de np.matmul()
você pode usar um operador @ equivalente e veremos isso imediatamente.
Como usar o operador @ em Python para multiplicar matrizes
Em Python, @
é um operador binário usado para multiplicação de matrizes.
Ele opera em duas matrizes e, em geral, matrizes NumPy N-dimensionais e retorna a matriz do produto.
Observação: Você precisa ter o Python 3.5 e posterior para usar o
@
operador.
Veja como você pode usá-lo.
C = A@B
print(C)
# Output
array((( 89, 107),
( 47, 49),
( 40, 44)))
Observe que a matriz do produto C é a mesma que obtivemos anteriormente.
Você pode usar np.dot() para multiplicar matrizes?
Se você já se deparou com um código que usa np.dot()
para multiplicar duas matrizes, veja como funciona.
C = np.dot(A,B)
print(C)
# Output:
(( 89 107)
( 47 49)
( 40 44))
você vai ver isso np.dot(A, B)
também retorna a matriz de produto esperada.
No entanto, conforme Documentos NumPy você deveria usar np.dot()
apenas para calcular o produto escalar de dois vetores unidimensionais e não para multiplicação de matrizes.
Lembre-se da seção anterior, o elemento no índice (i, j) da matriz de produto C é o produto escalar da linha i da matriz A e a coluna j da matriz B.
Como o NumPy transmite implicitamente essa operação de produto escalar para todas as linhas e colunas, você obtém a matriz de produto resultante. Mas para manter seu código legível e evitar ambiguidade, use np.matmul()
ou o @
operador em seu lugar.
Conclusão
Neste tutorial, você aprendeu o seguinte.
- Condição para que a multiplicação de matrizes seja válida: número de colunas na matriz A = número de linhas na matriz B.
- Como escrever uma função Python personalizada que verifica se a multiplicação de matrizes é válida e retorna a matriz do produto. O corpo da função usa loops for aninhados.
- Em seguida, você aprendeu como usar as compreensões de lista aninhada para multiplicar matrizes. Eles são mais sucintos do que loops for, mas são propensos a problemas de legibilidade.
- Por fim, você aprendeu a usar a função interna np.matmul() do NumPy para multiplicar matrizes e como isso é mais eficiente em termos de velocidade.
- Você também aprendeu sobre o @ operador para multiplicar duas matrizes em Python.
E isso encerra nossa discussão sobre multiplicação de matrizes em Python. Como próximo passo, aprenda como verificar se um número é primo em Python . Ou resolva interessante problemas em strings Python .
Boa aprendizagem!