3 maneiras de multiplicar matrizes em Python

Neste tutorial, você aprenderá a multiplicar duas matrizes em Python.

Você começará aprendendo a condição para a multiplicação de matrizes válida e escreverá uma função Python personalizada para multiplicar matrizes. A seguir, você verá como pode obter o mesmo resultado usando compreensões de lista aninhada.

Por fim, você continuará usando o NumPy e suas funções internas para realizar a multiplicação de matrizes com mais eficiência.

Como verificar se a multiplicação de matrizes é válida

Antes de escrever código Python para multiplicação de matrizes, vamos revisitar o básico da multiplicação de matrizes.

A multiplicação de matrizes entre duas matrizes A e B só é válida se o número de colunas da matriz A for igual ao número de linhas da matriz B.

Você provavelmente já se deparou com essa condição para a 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 do produto?

O elemento no índice (i, j) na matriz resultante C é o produto escalar da linha i da matriz A e coluna j da matriz B.

Então, para obter um elemento em um índice específico 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 produto C de forma mxp—com m linhas e p colunas, conforme mostrado abaixo.

E o produto escalar ou o produto interno entre dois vetores aeb é dado 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 também tem n elementos.

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 que o número de colunas na matriz A seja igual ao número de linhas na matriz B.

  Como (e por que) usar a função de outliers no Excel

Espero que você entenda a condição para que a multiplicação de matrizes seja válida e como obter cada elemento na matriz do produto.

Vamos continuar a 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 inteiros usando a função random.randint() do NumPy. 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 multiple_matrix(A,B). Esta função recebe duas matrizes A e B como entradas e retorna a matriz 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 prosseguir para analisar a definição da função.

Declare 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 do produto C acessível de fora, teremos que declará-la como uma variável global. Basta adicionar o qualificador global antes do nome da variável.

Verifique se a multiplicação de matrizes é válida: Use o atributo shape para verificar se A e B podem ser multiplicados. Para qualquer array arr, arr.shape[0] e arr.forma[1] dê o número de linhas e colunas, respectivamente. Então, se A.forma[1] == B.forma[0] verifica se a multiplicação de matrizes é válida. Somente se esta condição for True, a matriz do produto será computada. Caso contrário, a função retorna 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 loop for externo faz isso. O laço for interno nos ajuda a percorrer a coluna da matriz B. E o laço for mais interno ajuda a acessar cada elemento na coluna selecionada.

▶️ Agora que 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 multiplique_matriz() 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.

  Como conectar o Google Pay ao seu banco ou cartão de crédito para rastrear gastos

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 em uma compreensão de 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 listas em Python – com exemplos para obter uma compreensão aprofundada.

Antes de prosseguir, observe que gostaríamos de construir a matriz resultante C uma linha de cada vez.

Compreensão de lista aninhada explicada

Etapa 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. Assim, você pode obter um elemento em uma linha dessa maneira.

Passo 2: Construa uma linha na matriz C

Nosso próximo objetivo é construir uma linha inteira.

Para a linha 1 da 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.

  • Substitua pela expressão da etapa 1, porque é isso que você deseja fazer.
  • Em seguida, substitua por B_col—cada coluna na matriz B.
  • Finalmente, substitua por zip(*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

Passo 3: Construa todas as linhas e obtenha a matriz C

Em seguida, você terá que preencher a matriz do 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 novamente e faça o seguinte.

  • Substitua pela compreensão de lista da etapa 2. Lembre-se de que calculamos uma linha inteira na etapa anterior.
  • Agora, substitua por A_row—todas as linhas da matriz A.
  • E seu é a própria matriz A, enquanto 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://etechpt.com.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]]

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álida.

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 = [email protected]
print(C)

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

Observe que a matriz 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ê verá que np.dot(A, B) também retorna a matriz de produto esperada.

No entanto, conforme Documentos NumPyvocê deve 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 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 todas as colunas, você obtém a matriz do produto resultante. Mas para manter seu código legível e evitar ambiguidade, use np.matmul() ou o operador @.

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.
  • Finalmente, você aprendeu a usar a função interna do NumPy np.matmul() para multiplicar matrizes e como isso é o 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 problemas interessantes em strings Python.

Bom aprendizado!🎉