Matrizes em Python
Autor: Luiz Augusto Morais | Publicado: 2010-12-14T14:12:00-03:00

Olá, pessoal. Depois de longos dias sem posts, aqui estou eu transmitindo mais um pouco do meu ínfimo conhecimento sobre Python a vocês.

Hoje nós vamos estudar maneiras de como criar e manipular matrizes em Python. Primeiramente, quero dizer que não vou utilizar o módulo SciPy e sim os artifícios nativos da linguagem, pois este post tem um caráter didático. Porém, se você estiver interessado em aplicações mais "profissionais", indico utilizar o módulo citado anteriormente, pois ele é bastante eficiente.
Revisando matrizes...Na matemática, uma matriz é uma tabela composta de m x n&nbsp;elementos, onde m&nbsp;é o número de linhas e n&nbsp;o de colunas.
Existem vários tipos de matrizes. Veja abaixo os principais:

Matriz quadrada: o número de linhas é igual ao número de colunas.
Ex.:
[3, 1, &nbsp; &nbsp; &nbsp; &nbsp;[1, 2, 3,
&nbsp;2, 5] &nbsp; &nbsp; &nbsp; &nbsp; 4, 5, 6,
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7, 8, 9]

Matriz transposta:&nbsp;é uma matriz onde todos os elementos das linhas de M são transformados em colunas de Mt.
Ex.:
[1, 2, 3, &nbsp; &nbsp; &nbsp;==&gt; &nbsp; &nbsp; &nbsp;[1, 4,
&nbsp;4, 5, 6] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2, 5,
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3, 6]

Matriz identidade:&nbsp;é uma matriz quadrada onde todos os elementos da diagonal principal são iguais a 1 e as demais posições iguais a 0.
Ex.:
[1, 0, 0,
&nbsp;0, 1, 0,
&nbsp;0, 0, 1]

Operações com matrizesSoma de matrizes[1, 0, &nbsp; &nbsp; &nbsp;+ &nbsp; &nbsp; &nbsp;[2, 3, &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp;[3, 3,&nbsp;5, 2] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4, 2] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9, 4]Subtração de matrizes[1, 0, &nbsp; &nbsp; &nbsp;- &nbsp; &nbsp; &nbsp; [2, 3, &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp;[-1, -3,&nbsp;5, 2] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4, 2] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1, 0]Multiplicação por escalar2 &nbsp; * &nbsp; [1, 0, &nbsp; &nbsp; &nbsp;= &nbsp; &nbsp; &nbsp; [2, 0,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5, 2] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 10, 4]Multiplicação de matrizesClique&nbsp;aqui&nbsp;para ver exemplos de multiplicação de matrizes.Se quiser saber mais sobre matrizes, clique aqui.Como utilizar matrizes em Python?ListasA forma mais rápida e fácil de utilizar matrizes em Python é criando listas aninhadas.Veja o exemplo abaixo da representação de uma matriz 3 x 2 em Python.
matriz3x2 = [[4, 5, 1],
             [3, 2, 7]]
Como vocês podem ver, esta matriz nada mais é do que uma lista que contém listas. Estas listas mais internas estão representando as linhas&nbsp;e as colunas são representadas pelos elementos dos índices de cada linha.

Nesta matriz, as linhas são selecionadas pelo primeiro e as colunas pelo segundo índices.
Por exemplo, se eu quiser selecionar a segunda linha da matriz, utilizo o comando abaixo:
matriz3x2[1]
#Saída: [3, 2, 7]Coloco o índice 1, ao invés de 2, pois os índices das listas em Python começam do número 0.

Mas, se eu quiser acessar um elemento específico da matriz, tenho que utilizar o índice da linha e o da coluna:
matriz3x2[1][2]
#Saída: 7
List ComprehensionsSe você ainda não sabe usar list comprehensions, clique aqui e aqui.
Você pode utilizar este artifício em Python para extrair uma coluna específica de uma matriz, por exemplo.Ex.:coluna2 = [linha[1] for linha in matriz3x2]
print coluna2
#Saída: [5, 2]
Um outro exemplo de list comprehensions em matrizes é capturar os elementos da diagonal principal.
Ex.:
matriz2x2 = [[4, 5],
             [3, 2]]
             
diagonal_principal = [matriz[i][i] for i in (0, 1)]
print diagonal_principal
#Saída: [4, 2]DicionáriosExiste ainda outra forma de manipular matrizes em Python, é por meio de dicionários.
Esta abordagem é mais utilizada quando a matriz é esparsa, ou seja, a maioria dos seus elementos é igual a zero.
Poderíamos ter uma matriz usando listas assim:
matriz4 = [[4, 0, 0, 0, ],
             [0, 0, 0, 2, ],
             [0, 6, 0, 0, ],
             [0, 0, 0, 3, ]]

print matriz4[1][3]
#Saída: 2
Perceba que a maioria dos elementos da matriz são zeros. Ela pode ser otimizada se forem usados dicionários ao invés de listas.
Ex.:
matriz4dic = {(0,0): 4, (1, 3): 2, (2, 1): 6, (3,3): 3}
print matriz4dic[1, 3]
#Saída: 2Esta matriz tem os mesmo elementos da matriz anterior, retirando somente os zeros.

Porém, se você tentar acessar uma posição onde não existe chave, será lançado um erro:
&gt;&gt;&gt; matriz4dic[0,1]
Traceback (most recent call last):
  File "", line 1, in 
KeyError: (0, 1)
Para resolver isto, você só precisa utilizar o método get():
matriz4dic.get((0,1), 0)
0
O primeiro argumento é a posição do elemento na matriz e o segundo argumento é o valor que deve ser retornado caso a chave requerida não exista. Pronto, nosso problema está resolvido.

Espero que vocês tenham gostado das dicas. Qualquer dúvida, deixem um comentário abaixo.

Referências:
Aprenda Computação com Python
Learning Python, 3.ed.