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

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!