Compre o e-book deste material aqui!
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
Um numpy.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 numpy.array ou por números inteiros. O ndim de um numpy.array é seu número de dimensões (chamadas de axes77endnote: 7axes, do inglês, plural de axis, eixo.). O numpy.ndarray.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 3 -1 2]
dtype(’int64’)
(4,)
-1
array([ 3, -1])
temos um numpy.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.
(28) |
vetor coluna ou vetor linha.
Outro exemplo,
dtype(’float64’)
(2, 3)
-2.0
temos um numpy.array de números decimais (float) dispostos em um arranjo com dois axes (eixos). O primeiro axis tem tamanho e o segundo tem tamanho . Ou seja, podemos interpretá-lo como uma matriz de duas linhas e três colunas. Podemos fazer sua representação algébrica como
(29) |
Use numpy.array para alocar:
o vetor
(30) |
a matriz
(31) |
O NumPy conta com úteis funções de inicialização de numpy.array. Vejam algumas das mais frequentes:
numpy.zeros: inicializa um numpy.array com todos seus elementos iguais a zero.
array([0., 0.])
numpy.ones: inicializa um numpy.array com todos seus elementos iguais a .
array([[1, 1], [1, 1], [1, 1]])
numpy.empty: inicializa um numpy.array sem alocar valores para seus elementos88endnote: 8Atenção! No momento da alocação, os valores dos elementos serão dinâmicos conforme “lixo” da memória..
array([4.9e-324, 1.5e-323, 2.5e-323])
numpy.arange: inicializa um numpy.array com uma sequência de elementos99endnote: 9Similar à função Python range..
array([1, 3, 5])
numpy.linspace(a, b[, num=n]): inicializa um numpy.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.
array([0. , 0.25, 0.5 , 0.75, 1. ])
Construa um numpy.array para alocar uma partição uniforme com pontos do intervalo . Ou seja, um arranjo , de elementos , com passo .
Outras duas funções importantes no tratamento de arrays são:
numpy.reshape: permite a alteração da forma de um numpy.array.
[-2 -1]
[[-2] [-1]]
O numpy.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 2] [3 4]]
[[1] [2] [3] [4]]
numpy.transpose: computa a transposta de uma matriz.
[[1 2] [3 4]]
[[1 3] [2 4]]
numpy.concatenate: concatena arrays.
[1 2 2 3]
[[1 2] [2 3]]
Aloque o seguinte vetor como um numpy.array
(33) |
Então, use o método numpy.reshape para, a partir de b, alocar a matriz
(34) |
como um numpy.array.
Tendo em vista que
(35) |
é uma matriz ortogonal1010endnote: 10 é dita matriz ortogonal, quando ., compute .
Considere o seguinte sistema de equações
(36) | ||||
Use numpy.array para alocar:
a matriz de coeficientes deste sistema.
o vetor dos termos constantes deste sistema.
a matriz estendida deste sistema.
Os operadores aritméticos disponível no Python atuam elemento-a-elemento nos numpy.arrays. Por exemplo,
array([3, 5])
array([-1, -1])
array([2, 6])
array([1, 8])
array([4, 6])
O NumPy também conta com várias funções matemáticas elementares que operam elemento-a-elemento em arrays. Por exemplo,
array([3.14159265, 1.41421356])
array([1.22464680e-16, 9.87765946e-01])
array([23.14069263, 4.11325038])
Compute os valores da função cosseno para os elementos do vetor
(37) |
O numpy conta com um módulo de álgebra linear, usualmente importado com
Um vetor podem ser alocado usando um numpy.array de um eixo (dimensão). Por exemplo,
(38) | |||
(39) |
podem ser alocados com
[ 2 -1]
e
[3. 1. 3.14159265]
Aloque cada um dos seguintes vetores como um numpy.array:
Dados dois vetores
(40) | |||
(41) |
define-se o produto escalar por
(42) |
Com o NumPy, podemos computá-lo com a função hlnumpy.dot. Por exemplo,
2
A norma de um vetor é definida por
(43) |
O NumPy conta com o método numpy.linalg.norm para computá-la. Por exemplo,
4.457533443631058
Faça um código para computar o produto escalar sendo
(44) | |||
(45) |
Uma matriz pode ser alocada como um numpy.array de dois eixos (dimensões). Por exemplo, as matrizes
(48) | |||
(52) |
podem ser alocadas como segue
[[ 2 -1 7] [ 3 1 0]]
e
[[ 4 0] [ 2 1] [-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 4.1.3). Na sequência, vamos introduzir outras operações próprias deste tipo de objeto.
Aloque cada uma das seguintes matrizes como um numpy.array:
(53) |
Seja
Determine o formato (shape) dos seguintes arrays:
A[:,0]
A[:,0:1]
A[1:3,0]
A[1:3,0:1]
A[1:3,0:2]
Além das inicializações de arrays já estudadas na Subseção 4.1.1, temos mais algumas que são particularmente úteis no caso de matrizes.
numpy.eye(n): retorna a matriz identidade .
[[1. 0. 0.], [0. 1. 0.], [0. 0. 1.]]
numpy.diag: extrai a diagonal ou constrói um numpy.array diagonal.
[[1, 0, 0], [0, 2, 0], [0, 0, 3]]
Aloque a matriz dos coeficientes e o vetor dos termos constantes do seguinte sistema de equações
(54) | ||||
onde , , , n=5.
A multiplicação da matriz pela matriz é a matriz tal que
(55) |
O numpy tem a função numpy.matmul para computar a multiplicação de matrizes. Por exemplo, a multiplicação das matrizes dadas em (48) e (52), computamos
[[-50 41], [ 14 1]]
É importante notar que numpy.matmul(A,B) é a multiplicação de matrizes, enquanto que * consiste na multiplicação elemento a elemento. Alternativamente a numpy.matmul(A,B) pode-se usar A @ B.
Aloque as matrizes
(59) | |||
(63) | |||
(66) |
Então, se existirem, compute e forneça as dimensões das seguintes matrizes
O numpy tem a função numpy.ndarray.trace para computar o traço de uma matriz (soma dos elementos de sua diagonal). Por exemplo,
tr(A) = -1
Já, o determinante é fornecido no módulo numpy.linalg. Por exemplo,
det(A) = 25.000000000000007
Compute a solução do seguinte sistema de equações
(67) | ||||
pelo método de Cramer1111endnote: 11Gabriel Cramer, 1704 - 1752, matemático suíço. Fonte: Wikipédia: Gabriel Cramer..
O rank de uma matriz é o número de linhas ou colunas linearmente independentes. O numpy conta com a função numpy.linalg.matrix_rank para computá-lo. Por exemplo,
3
2
O método numpy.linalg.inv pode ser usado para computar a inversa de uma matriz full rank. Por exemplo,
Ainv @ A = [[ 1.00000000e+00 -2.22044605e-16 -8.88178420e-16] [ 0.00000000e+00 1.00000000e+00 0.00000000e+00] [ 0.00000000e+00 -2.22044605e-16 1.00000000e+00]]
Compute, se possível, a matriz inversa de cada uma das seguintes matrizes
(70) | |||
(74) |
Verifique suas respostas.
Um auto-par de uma matriz , um escalar chamado de autovalor e é um vetor chamado de autovetor, é tal que
(75) |
O numpy tem a função numpy.linalg.eig para computar os auto-pares de uma matriz. Por exemplo,
autovalores = [1. 1. 1.] autovetores = [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
Observamos que a função retorna um tuple de numpy.arrays, sendo que o primeiro contém os autovalores (repetidos conforme suas multiplicidades) e o segundo item é a matriz dos autovetores (dispostos nas colunas).
Compute os auto-pares da matriz
(76) |
Então, verifique se, de fato, para cada auto-par computado.
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 Uso 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!