| | | | |

5 Elementos da computação matricial

Nesta seção, vamos explorar a NumPy (Numerical Python), biblioteca para tratamento numérico de dados. Ela é extensivamente utilizada nos mais diversos campos da ciência e da engenharia. Aqui, vamos nos restringir a introduzir algumas de suas ferramentas para a computação matricial.

Usualmente, a biblioteca é importada como segue

1>>> import numpy as np

5.1 NumPy array

Um array é uma tabela de valores (vetor, matriz ou multidimensional) e contém informação sobre os dados brutos, indexação e como interpretá-los. Os elementos são todos do mesmo tipo (diferente de uma lista Python), referenciados pela propriedade dtype. A indexação dos elementos pode ser feita por um tuple de inteiros não negativos, por booleanos, por outro array ou por números inteiros. O rank de um array é seu número de dimensões (chamadas de axes88endnote: 8Do inglês, plural de axis, eixo.). O shape é um tuple de inteiros que fornece seu tamanho (número de elementos) em cada dimensão. Sua inicialização pode ser feita usando-se listas simples ou encadeadas. Por exemplo,

1>>> a = np.array([1,3,-1,2])
2>>> print(a)
3[ 1  3 -1  2]
4>>> a.dtype
5dtype('int64')
6>>> a.shape
7(4,)
8>>> a[2]
9-1
10>>> a[1:3]
11array([ 3, -1])

temos um array de números inteiros com quatro elementos dispostos em um único axis (eixo). Podemos interpretá-lo como uma representação de um vetor linha ou coluna, i.e.

a=(1,3,1,2) (28)

vetor coluna ou aT vetor linha.

Outro exemplo,

1>>> a = np.array([[1.0,2,3],[-3,-2,-1]])
2>>> a.dtype
3dtype('float64')
4>>> a.shape
5(2, 3)
6>>> a[1,1]
7-2.0

temos um array de números decimais (float) dispostos em um arranjo com dois axes (eixos). O primeiro axis tem tamanho 2 e o segundo tem tamanho 3. Ou seja, podemos interpretá-lo como uma matriz de duas linhas e três colunas. Podemos fazer sua representação algébrica como

a=[123321] (29)

5.1.1 Inicialização de um array

O NumPy conta com úteis funções de inicialização de array. Vejam algumas das mais frequentes:

  • np.zeros(): inicializa um array com todos seus elementos iguais a zero.

    1>>> np.zeros(2)
    2array([0., 0.])
  • np.ones(): inicializa um array com todos seus elementos iguais a 1.

    1>>> np.ones((3,2), dtype='int')
    2array([[1, 1],
    3       [1, 1],
    4       [1, 1]])
  • np.empty(): inicializa um array sem alocar valores para seus elementos99endnote: 9Atenção! Os valores dos elementos serão dinâmicos conforme “lixo” da memória..

    1>>> np.empty(3)
    2array([4.9e-324, 1.5e-323, 2.5e-323])
  • np.arange(): inicializa um array com uma sequência de elementos1010endnote: 10Similar a função Python range..

    1>>> np.arange(1,6,2)
    2array([1, 3, 5])
  • np.linspace(a, b[, num=n]): inicializa um array como uma sequência de elementos que começa em a, termina em b (incluídos) e contém n elementos igualmente espaçados.

    1>>> np.linspace(0, 1, num=5)
    2array([0.  , 0.25, 0.5 , 0.75, 1.  ])

5.1.2 Manipulação de arrays

Outras duas funções importantes no tratamento de arrays são:

  • arr.reshape(): permite a alteração da forma de um array.

    1>>> a = np.array([-2,-1])
    2>>> a
    3array([-2, -1])
    4>>> a.reshape(2,1)
    5array([[-2],
    6        [-1]])

    O arr.reshape() também permite a utilização de um coringa -1 que será dinamicamente determinado de forma obter-se uma estrutura adequada. Por exemplo,

    1>>> a = np.array([[1,2],[3,4]])
    2>>> a
    3array([[1, 2],
    4       [3, 4]])
    5>>> a.reshape((-1,1))
    6array([[1],
    7       [2],
    8       [3],
    9       [4]])
  • arr.transpose(): computa a transposta de uma matriz.

    1>>> a = np.array([[1,2],[3,4]])
    2>>> a
    3array([[1, 2],
    4        [3, 4]])
    5>>> a.transpose()
    6array([[1, 3],
    7        [2, 4]])
  • np.concatenate(): concatena arrays.

    1>>> a = np.array([1,2])
    2>>> b = np.array([2,3])
    3>>> c = np.concatenate((a,b))
    4>>> c
    5array([1, 2, 2, 3])
    6>>> a = a.reshape((1,-1))
    7>>> a.ndim
    82
    9>>> b = b.reshape((1,-1))
    10>>> b
    11array([[2, 3]])
    12>>> d = np.concatenate((a,b), axis=0)
    13>>> d
    14array([[1, 2],
    15      [2, 3]])

5.1.3 Operadores elemento-a-elemento

Os operadores aritméticos disponível no Python atuam elemento-a-elemento nos arrays. Por exemplo,

1>>> a = np.array([1,2])
2>>> b = np.array([2,3])
3>>> a+b
4array([3, 5])
5>>> a-b
6array([-1, -1])
7>>> b*a
8array([2, 6])
9>>> a**b
10array([1, 8])
11>>> 2*b
12array([4, 6])

O NumPy também conta com várias funções matemáticas elementares que operam elemento-a-elemento em arrays. Por exemplo,

1>>> a = np.array([np.pi, np.sqrt(2)])
2>>> a
3array([3.14159265, 1.41421356])
4>>> np.sin(a)
5array([1.22464680e-16, 9.87765946e-01])
6>>> np.exp(a)
7array([23.14069263,  4.11325038])
Observação 5.1.

O NumPy contém um série de outras funções práticas para a manipulação de arrays. Consulte NumPy: the absolute basics for beginners.

5.2 Elementos da álgebra linear

O NumPy conta com um módulo de álgebra linear

1>>> from numpy import linalg

5.2.1 Vetores

Um vetor podem ser representado usando um array de um eixo (dimensão) ou um com dois eixos, caso se queira diferenciá-lo entre um vetor linha ou coluna. Por exemplo, os vetores

a=(2,1,7), (30)
b=(3,1,0)T (31)

podem ser alocados com

1>>> x = np.array([2,-1,7])
2>>> y = np.array([3,1,0])

Caso queira-se que x siga um arranjo em coluna, pode-se modificado como segue

1>>> a = a.reshape((-1,1))
2>>> a
3array([[ 2],
4       [-1],
5       [ 7]])

Como já vimos, o NumPy conta com operadores elemento-a-elemento que podem ser utilizados na álgebra envolvendo arrays, logo também aplicáveis a vetores (consulte a Subseção 5.1.3). Vamos, aqui, introduzir outras operações próprias deste tipo de objeto.

Exercício 5.2.1.

Aloque cada um dos seguintes vetores como um NumPy array:

  1. a)

    x=(1.2,3.1,4)

  2. b)

    y=xT

  3. c)

    z=(π,2,e2)T

5.2.2 Produto escalar e norma

Dados dois vetores,

x=(x0,x1,,xn1), (32)
y=(y0,y1,,yn1) (33)

define-se o produto escalar por

xy=x0y0+x1y1++xn1yn1 (34)

Com o NumPy, podemos computá-lo com a função np.dot(). Por exemplo,

1>>> x = np.array([-1, 0, 2, 4])
2>>> y = np.array([0, 1, 1, -1])
3>>> np.dot(x,y)
4-2

A norma (euclidiana) de um vetor é definida por

x=i=0n1xi2. (35)

O NumPy conta com a função np.linalg.norm() para computá-la. Por exemplo,

1>>> np.linalg.norm(y)
21.7320508075688772
Exercício 5.2.2.

Faça um código para computar o produto escalar xy sendo

x=(1.2,ln(2),4), (36)
y=(π2,3,e) (37)

5.2.3 Matrizes

Uma matriz pode ser alocada como um NumPy array de dois eixos (dimensões). Por exemplo, as matrizes

A=[217310], (40)
B=[402186] (44)

podem ser alocadas como segue

1>>> A = np.array([[2,-1,7],[3,1,0]])
2>>> A
3array([[ 2, -1,  7],
4       [ 3,  1,  0]])
5>>> B = np.array([[4,0],[2,1],[-8,6]])
6>>> B
7array([[ 4,  0],
8       [ 2,  1],
9       [-8,  6]])

Como já vimos, o NumPy conta com operadores elemento-a-elemento que podem ser utilizados na álgebra envolvendo arrays, logo também aplicáveis a matrizes (consulte a Subseção 5.1.3). Vamos, aqui, introduzir outras operações próprias deste tipo de objeto.

Exercício 5.2.3.

Aloque cada uma das seguintes matrizes como um Numpy array:

  1. a)
    A=[122460] (45)
  2. b)

    B=AT

Exercício 5.2.4.

Seja

1>>> A = np.array([[2,1],[1,1],[-3,-2]])

Determine o formato (shape) dos seguintes arrays:

  1. a)

    A[:,0]

  2. b)

    A[:,0:1]

  3. c)

    A[1:3,0]

  4. d)

    A[1:3,0:1]

  5. e)

    A[1:3,0:2]

5.2.4 Inicialização de matrizes

Além das inicializações de arrays já estudadas na Subseção 5.1.1, temos mais algumas que são particularmente úteis no caso de matrizes.

  • np.eye(n): retorna a matriz identidade n×n.

    1>>> np.eye(3)
    2array([[1., 0., 0.],
    3      [0., 1., 0.],
    4      [0., 0., 1.]])
  • np.diag(v): retorna uma matriz diagonal formada pela list v.

    1>>> np.diag([1,2,3])
    2array([[1, 0, 0],
    3      [0, 2, 0],
    4      [0, 0, 3]])
Exercício 5.2.5.

Aloque a matriz escalar C=[cij]i,j=099, sendo cii=π e cij=0 para ij.

5.2.5 Multiplicação de matrizes

A multiplicação da matriz A=[aij]i,j=0n1,l1 pela matriz B=[bij]i,j=0l1,m1 é a matriz C=AB=[cij]i,j=0n1,m1 tal que

cij=k=0l1aikbk,j (46)

O NumPy tem a função np.matmul() para computar a multiplicação de matrizes. Por exemplo, a multiplicação das matrizes dadas em (40) e (44), computamos

1>>> C = np.matmul(A,B)
2>>> C
3array([[-50,  41],
4       [ 14,   1]])
Observação 5.2.

É importante notar que np.matmul(A,B) é a multiplicação de matrizes, enquanto que * consiste na multiplicação elemento a elemento. Alternativamente a np.matmul(A,B) pode-se usar A @ B.

Exercício 5.2.6.

Aloque as matrizes

C=[121321023] (50)
D=[231164] (54)
E=[121013] (57)

Então, se existirem, compute e forneça as dimensões das seguintes matrizes

  1. a)

    CD

  2. b)

    DTE

  3. c)

    DTC

  4. d)

    DE

5.2.6 Traço e Determinante de uma matriz

O NumPy tem a função arr.trace() para computar o traço de uma matriz (soma dos elementos de sua diagonal). Por exemplo,

1>>> A = np.array([[-1,2,0],[2,3,1],[1,2,-3]])
2>>> A.trace()
3-1

Já, o determinante é fornecido no módulo np.linalg. Por exemplo,

1>>> A = np.array([[-1,2,0],[2,3,1],[1,2,-3]])
2>>> np.linalg.det(A)
325.000000000000007
Exercício 5.2.7.

Compute e verifique os traços e os determinantes das seguintes matrizes

C=[2314] (60)
D=[311102421] (64)

5.2.7 Rank e inversa de uma matriz

O rank de uma matriz é o número de linhas ou colunas linearmente independentes. O NumPy conta com a função matrix_rank() para computá-lo. Por exemplo,

1>>> np.linalg.matrix_rank(np.eye(3))
23
3>>> A = np.array([[1,2,3],[-1,1,-1],[0,3,2]])
4>>> np.linalg.matrix_rank(A)
52

A inversa de uma matriz full rank pode ser computada com a função np.linalg.inv(). Por exemplo,

1>>> A = np.array([[1,2,3],[-1,1,-1],[1,3,2]])
2>>> np.linalg.matrix_rank(A)
33
4>>> Ainv = np.linalg.inv(A)
5>>> np.matmul(A,Ainv)
6array([[ 1.00000000e+00,  0.00000000e+00,  0.00000000e+00],
7       [ 1.11022302e-16,  1.00000000e+00,  2.22044605e-16],
8       [-2.22044605e-16,  0.00000000e+00,  1.00000000e+00]])
Exercício 5.2.8.

Compute, se possível, a matriz inversa de cada uma das seguintes matrizes

B=[2121] (67)
C=[201311210] (71)

Verifique suas respostas.

5.2.8 Autovalores e autovetores de uma matriz

Um auto-par (λ,v), λ um escalar chamado de autovalor e v0 é um vetor chamado de autovetor, é tal que

Aλ=λv. (72)

O NumPy tem a função np.linalg.eig() para computar os auto-pares de uma matriz. Por exemplo,

1>>> np.linalg.eig(np.eye(3))
2(array([1., 1., 1.]), array([[1., 0., 0.],
3       [0., 1., 0.],
4       [0., 0., 1.]]))

Observamos que a função uma dupla, sendo o primeiro item um array contendo os autovalores (repetidos conforme suas multiplicidades) e o segundo item é a matriz dos autovetores, onde estes são suas colunas.

Exercício 5.2.9.

Compute os auto-pares da matriz

A=[132321211]. (73)

Então, verifique se, de fato, Av=λv para cada auto-par (λ,v) computado.


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Use de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!