Aula 22
1 Teste
defina um decorator descontinuada(f, nome1, nome2)
que apenas na primeira vez
que a funcao f é chamada imprime
a funcao nome1 sera descontinuada na proxima edicao da biblioteca use a funcao nome2 na proxima versão
e roda a funcão f
. nas outras chamadas a funcão modificada apenas
roda a função f
2 Evite fazer seu proprio for
no numpy
Algo que esses tutorials nao falam é que voce deve evitar fazer seu
proprio for
para manipular as matrizes - eles são muito mais lentos
que funções e operações ja implementadas no numpy e no scipy.
Sempre que possivel use essas funçoes implementadas uma lista.
import numpy as np a = np.ones((1000,1000)) def f1(x): out = [] for j in range(shape(x)[1]): s=0 for i in range(shape(x)[0]): s+=x[i,j] out.append(s) return out() def f2(x): return np.sum(x,axis=0) %timeit f1(a) %timeit f2(a)
Ainda mais rapido, ou para rodas em gpu, use o numba
https://numba.pydata.org/
2.1 Operacoes matematicas
- + - * / % fazem operacoes elemento por elemento
- np.minimum, np.logicaland por elemento!
- A.dot(B) ou np.dot(A,B) - produto de matrizes tradicional
- np.min, np.sum fazer "sumarios", globais, ou pro linha ou por coluna
3 interacoes mais complexas em arrays
de uma olhada no 4 video de https://www.youtube.com/watch?v=rN0TREj8G7U&list=PLeo1K3hjS3uset9zIVzJWqplaWBiacTEU]] que fala sobre uma função util para fazer iteração em arrays.
4 Bibliotecas de algebra linear de baixo nivel
Numpy manda os arrays que sao contigous para bibliotecas de baixo nivel que fazem as operacoes matematicas https://docs.scipy.org/doc/numpy/reference/routines.linalg.html. Arrays que não sao contigous sao copiados e rearranjados
- BLAS http://www.netlib.org/blas/
- openBLAS https://github.com/xianyi/OpenBLAS/releases
- LAPACK http://www.netlib.org/lapack/lug/
- MKL https://software.intel.com/en-us/mkl
- ATLAS
- Armadillo http://arma.sourceforge.net/
5 exercicios
- dado 1 array 1D, troque todos os valores > 0 para 1 e os < 0 para -1
- Dado uma matriz, normalize as linhas de forma que a norma (soma dos quadrados) das linhas seja 1.
- normalize as linhas cujos elementos na primeira coluna são negativo
- compute uma array 1D com o item de menor valor absoluto para cada coluna.
mm = np.array(([[-5, -4, -3, 1], [-1, 0, 10, 2], [ 3, 4, 5, 0]]) a = np.amin(np.abs(mm),axis=0) print(a) array([1, 0, 3, 0])
Essa solução nao esta 100% certa. 1 nao é o menor numero em valor
absoluto de mm
, o -1 é! Da mesma forma o 3 nao é o resultado correto,
deveria ser o -3
a = np.argmin(np.abs(mm),axis=0) print(a) array([1, 1, 0, 2])
Agora a
contem a linha correta. Precisamos usar uma das indexações
complexas de array para pegar a linha correta (em a
) e a coluna
correta ([0,1,2,3]
)
a = np.argmin(np.abs(mm),axis=0) print(mm[a, np.array([0,1,2,3])]) [-1 0 -3 0]
Agora deu certo!