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.
- Sempre que possivel use essas funçoes implementadas uma lista.
- 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.
- 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.