MC-102 — Aula 14
Vetores e matrizes
Vetor é uma sequencia de numeros de um certo tamanho.
para coisas simples, e para tamanhos de vetores pequenos voce pode usar uma lista de numeros como um vetor.
mas veremos que existe o pacote Numpy
(que precisa
ser instalado) mais apropriado para isso.
matrizes são estruturas 2D (retangulos ou quadrados) de dados numericos.
a matrix
1 2 3 4
5 6 7 8
9 10 11 12
pode ser representado como a lista:
mat = [ [1, 2, 3, 4 ], [5, 6, 7, 8,], [9, 10, 11, 12,] ]
uma lista de 3 elementos onde cada elemento é uma lista que representa uma linha da matriz
o numero 7 esta na posicao 3 da segunda linha e portanto é indexado como
mat[1][2]
mat[1]
é o segundo elemento da lista mat
que é ele mesmo uma lista/linha. o [2]
pega o 3o elemento
desta linha.
numpy é um pacote que implementa uma coisa generica chamada
array
Um vetor é um array de uma dimensao, uma matriz é um
array de 2 dimensões. Arrays podem ter 3 ou mais dimensões.
Um array 3D pode representar valores num espaço 3D, tipo temperatura na sala, ou no oceano…
Para usar os itens deste pacote deve-se importá-lo inicialmente com o comando
import numpy as np
O objeto mais simples da biblioteca é o array que serve para criar vetores homogêneos multi-dimensionais.
Um vetor pode ser criado a partir de uma lista:
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> a.ndim
1
>>> a.size
3
>>>
Neste exemplo criamos um array de dimensão 1 com tamanho 3.
Um uma matriz pode ser criada a partir de uma lista de listas como acima:
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> a.ndim
2
>>> a.size
6
>>>
Neste exemplo criamos um array de dimensão 2 com tamanho 6.
Um array
pode ser criado com mais do que uma
dimensão utilizando as funções arange e
reshape.
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a = np.arange(10).reshape(2,5)
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>>
o shape de um array é o numero de linhas (se 1D) ou o numero de linhas e colunas (se 2D) ou o numero de fatias, colunas e linhas (se 3D), etc.
Neste exemplo criamos um array de dimensão 1 com tamanho 10 e depois rearanjamos esses 10 valores em um formato bidimensional 2 x 5.
NumPy oferece a função zeros que cria um array contendo apenas zeros. Seu argumento de entrada é uma tupla com o shape
>>> np.zeros((3))
array([ 0., 0., 0.])
>>> np.zeros((3,4))
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>>
Também existe a função ones que cria um array inicializado com uns.
>>> np.ones((2,5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
>>>
e outros
https://numpy.org/doc/stable/reference/arrays.indexing.html
X = np.arange(1000).reshape((10,100))
X.shape # 10 linhas 100 colunas
X[2,3]
veja que é diferente da indexação matriz como lista de listas
(X[2][3]
)
X[0:4,8]
X[:,8]
X[0:4,8:10]
X[1] - 2a linha, todas as colunas
arr = np.array([3,39,29,12])
lis = [3,39,29,12]
X[3,arr]
X[3,lis]
arr
arr[np.array([True,False,False,True])
e = np.array([True,False,False,True,False,False,True,False,False,True,False])
X[e,8]
+ - * /
funcionam para array (operação elemento por
elemento)
*
não é a multiplicação de matrizes (isso é o método
dot
)
a = np.array([10,20,30])
b = np.array([1,2,3])
a+b
a*b
a/b
a.dot(b)
np.dot(a,b)
==
funciona para arrays (elemento por
elemento)a = np.array([1,2,3])
b = np.array([1,4,3])
a == b
diferente de listas que verificam se as 2 listas sao iguais
[1,2,3] == [1,4,3]
np.all( np.array([1,2,3]) == np.array([1,4,3]) )
a = np.array([1,2,3])
b = np.array([1,4,3])
a > b
np.greater(a,b)
operações logicas em arrays nao funcionam - use as funçoes do numpy
a = np.array([ True, False, True])
b = np.array([ True, False, False])
a and b
np.logical_and(a,b)
os argumentos não precisam ter a mesmas ndim (inclusive atribuição)
a+2
4*X
np.array([1,2,3]) == 1
X % 2 == 0
mais eficiente em memoria
mais rapido
funcoes uteis.
nao fazer loops explicitos
Rodar no ipython
import numpy as np
def g1(x):
for i in range(x.shape[0]):
for j in range(x.shape[1]):
if x[i,j] < 0.5:
x[i,j]=0.0
return x
def g2(x):
x[x<0.5]=0.0
return x
y = np.random.rand(4000,30)
x = np.array(y,copy=True)
%timeit x1 = g1(x)
x = np.array(y,copy=True)
%timeit x2 = g2(x)
x<0.5
é um array 2D booleano que sever para indexar
os elementos de x que vao trocar de valor
np.log
+ - / *
np.add
np.greater
>
np.logical_and
axis
- faz a operação agregação nessa
dimensão - sobram as outras
a = np.arange(24).reshape(3,4,2)
a
np.sum(a,axis=0)
np.amax(a,axis=(1,2))
https://numpy.org/doc/stable/reference/routines.array-manipulation.html#joining-arrays
concatenate
- numa dimensão que ja existe - para arrays
2D vstack
e hstack
para juntar na vertical ou
na horizontalstack
numa nova dimensãohttps://numpy.org/doc/stable/reference/routines.linalg.html
Formato interno para matrizes npy
Texto
csv