Aula 21

1 Finalizando MC346

Eu fiz uma intervenção cirurgica duas semanas atras e minha voz nao se recuperou tao rapidamente quanto o esperado.

É improvável que minha voz melhore significativamente nas próximas semanas. Assim nos terminaremos a disciplina MC346 na 5a feira da semana que vem, com o teste final.

So sobrou um tópico que precisaria ser coberto em Python: arrays numpy e talvez cython.

1.1 Numpy

arrays em numpy são diferentes de listas ou listas de listas. Eles sao mais eficientes e ninguém serio usaria listas ou lista de listas em aplicações cientificas, que precisam ser eficientes tanto em memoria utilizada como em tempo de execução.

Veja os 3 primeiros videos em https://www.youtube.com/watch?v=rN0TREj8G7U&list=PLeo1K3hjS3uset9zIVzJWqplaWBiacTEU que mostra bem os conceitos basicos de numpy.

https://www.datacamp.com/community/tutorials/python-numpy-tutorial é um texto tambem bom

https://docs.scipy.org/doc/numpy-1.15.1/user/quickstart.html é user guide do numpy mas eu acho o texto um pouco difícil para aprender.

1.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.

  1. Sempre que possivel use essas funçoes implementadas uma lista.
  2. Se nao for possivel, entao 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.
  3. Ou implemente a sua função em cython. Cython é uma combinação de C e python que é compilada e integra facilmente com python. Uma das seçoes desse manual fala como integrar com o numpy.

1.3 Teste do dia 22

sera sobre numpy. mas eu espero soluções que nao usam o for, e sim solucoes que usam as funcoes de numpy diretamente

  • dado uma matriz, normalize as linhas de forma que a norma (soma dos quadrados) das linhas seja 1
  • dado uma matriz, normalize as colunas
  • dado ma matriz, calcule a soma dos elementos das linhas cujos 1o valores ( o valor da coluna 0) sao > 0 (uma soma por linha)
  • 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 solucao nao esta 100% certa. 1 nao é o menor numero em valor absoluto de mm -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 o a contem a linha correta. Precisamos usar uma das incexacoes complexas de array para pegar a linha correta (em a) e a coluna correta

a = np.argmin(np.abs(mm),axis=0)
print(mm[a, np.array([0,1,2,3])])
[-1  0 -3  0]

Agora deu certo!

  • dado 1 array 1D, troque todos os valores > 0 para 1 e os < 0 para -1










2 Projeto

A versão 2 do projeto especifica o formato de saida e como o programa sera executado. A pagina tambem contem 3 exemplos com as suas saidas.

Projeto para ser entregue via email dia 21/11 ate as 8h.











3 Exercicio

INDIVIDUAL

A lei de Benford diz que uma distribuição do primeiro dígito de uma coleção de números reais não é uniforme (cada digito de 1 a 9 tem a mesma probabilidade de ser o primeiro digito de um número) mas segue uma distribuição que decai logaritmicamente. O link contem a formula da lei de Benford, mas em geral o digito 1 deve aparecer 30% das vezes, o digito 2 17.6%, o digito 3 12.5% etc.

Escreva a função benford que dado um string que pode conter multiplas linhas (o string pode conter varios '\n'), imprime a proporção que cada um dos dígitos de 1 a 9 é o primeiro digito de um numero. Um numero ou esta no começo de uma linha ou esta separado de outro numero ou palavra por brancos.

Pro favor respondam o questionario de avaliação do curso também.











Author: Jacques Wainer

Created: 2018-11-13 Tue 10:21

Validate