A.3 Matrizes
Em Python, temos um ótimo suporte para computação científica com o pacote numpy.
Uma matriz
em Python é definida usando-se a seguinte sintaxe:
>>> import numpy as np
>>> A = np.array([[ a11 , a12 , ... , a1n], [...]. [am1 , am2 , ... , amn]])
Exemplo A.3.1. Defina a matriz:
Solução. Em Python, digitamos:
>>> import numpy as np
>>> A = np.array([[1,2,3],
... [4,5,6]])
>>> print(A)
[[1 2 3]
[4 5 6]]
A seguinte lista contém uma série de funções que geram matrizes
particulares:
numpy.eye matriz identidade
numpy.linspace vetor de elementos linearmente espaçados
numpy.ones matriz cheia de uns
numpy.zeros matriz nula
A.3.1 Obtendo dados de uma matriz
A função numpy.shape retorna o tamanho de uma matriz, por exemplo:
>>> A = np.ones((3,2))
>>> print(A)
[[ 1. 1.]
[ 1. 1.]
[ 1. 1.]]
>>> nl, nc = np.shape(A)
>>> print(nl,nc)
(3, 2)
informando que a matriz A tem três linhas e duas colunas.
Existem vários métodos para acessar os elementos de uma matriz dada
A:
- a matriz inteira acessa-se com a sintaxe:
A
- o elemento da -ésima
linha e -ésima
coluna acessa-se usando a sintaxe:
A[i,j]
- o bloco formado pelas linhas ,
e pelas
colunas ,
obtém-se usando a sintaxe:
A[i1:i2, j1:j2]
Exemplo A.3.2. Veja as seguintes linhas de comando:
>>> from numpy import random
>>> A = np.random.random((3,4))
>>> A
array([[ 0.39235668, 0.30287204, 0.24379253, 0.98866709],
[ 0.72049734, 0.99300252, 0.14232844, 0.25604346],
[ 0.61553036, 0.80615392, 0.22418474, 0.13685148]])
>>> A[2,3]
0.13685147547025989
>>> A[1:3,1:4]
array([[ 0.99300252, 0.14232844, 0.25604346],
[ 0.80615392, 0.22418474, 0.13685148]])
Definida uma matriz
em Python, as seguintes sintaxes são bastante úteis:
A[:,:] toda a matriz
A[i:j,k] os elementos das linhas i até j (exclusive) da k-ésima coluna
A[i,j:k] os elementos da i-ésima linha das colunas j até k (exclusive)
A[i,:] a i-ésima linha da matriz
A[:,j] a j-ésima coluna da matriz
Atenção, os índices em Python iniciam-se em
.
Assim, o comando A[1:3,1:4] retorna o bloco da matriz
compreendido da segunda à terceira linha e da segunda a quarta coluna desta
matriz.
Exemplo A.3.3. Veja as seguintes linhas de comando:
>>> B = np.random.random((4,4))
>>> B
array([[ 0.94313432, 0.72650883, 0.55487089, 0.18753526],
[ 0.02094937, 0.45726099, 0.51925464, 0.8535878 ],
[ 0.75948469, 0.95362926, 0.77942318, 0.06464183],
[ 0.91243198, 0.22775889, 0.04061536, 0.14908227]])
>>> aux = np.copy(B[:,2])
>>> B[:,2] = np.copy(B[:,3])
>>> B[:,3] = np.copy(aux)
>>> B
array([[ 0.94313432, 0.72650883, 0.18753526, 0.55487089],
[ 0.02094937, 0.45726099, 0.8535878 , 0.51925464],
[ 0.75948469, 0.95362926, 0.06464183, 0.77942318],
[ 0.91243198, 0.22775889, 0.14908227, 0.04061536]])
A.3.2 Operações matriciais e elemento-a-elemento
Em Python com numpy, o operador * opera elemento a elemento. Por
exemplo:
>>> A = np.array([[1,2],[2,1]]); print(A)
[[1 2]
[2 1]]
>>> B = np.array([[2,1],[2,1]]); print(B)
[[2 1]
[2 1]]
>>> print(A*B)
[[2 2]
[4 1]]
A multiplicação matricial obtemos com:
>>> C = A.dot(B)
>>> print(C)
[[6 3]
[6 3]]
Aqui, temos as sintaxes análogas entre operações elemento-a-elemento:
+ adição
- subtração
* multiplicação
/ divisão
** potenciação
Exemplo A.3.4. Veja as seguintes linhas de comando:
>>> A = np.ones((2,2))
>>> A
array([[ 1., 1.],
[ 1., 1.]])
>>> B = 2 * np.ones((2,2))
>>> B
array([[ 2., 2.],
[ 2., 2.]])
>>> A*B
array([[ 2., 2.],
[ 2., 2.]])
>>> A.dot(B)
array([[ 4., 4.],
[ 4., 4.]])
>>> A/B
array([[ 0.5, 0.5],
[ 0.5, 0.5]])