VI Semana de Inverno de Geofísica 20 a 24 de Julho/2015 — INCT-GP, UNICAMP, Campinas, SP Python para a Geoscientistas (1 Dia) Prof. George Sand França SIS-UnB Introdução Maior produtividade para “geocientistas” Sintaxe simplificada Integração de dados de simulação, visualização e análise Formato – maior flexibilidade 2 Porque Python? • Simulação, visualização e analise de dados • Suporta diferentes formatos • Oferece uma exaustiva biblioteca (library) para criar interfaces gráficas (GUIs) de uma forma profissional • Serve como interface moderna para códigos antigos. 3 Nesse curso não iremos ensinar conceitos básicos para programação • Tutorial prático – Variáveis – Loops – Condicional (if/else), controle de fluxo (for, while) – Tipo de dados int, float, string, list / arrays – Leitura/escrever dados para arquivos 4 Porque Python é tão perfeito para Ciência? • Sintaxe legível: – Existe um elemento em uma list/dict? $python >>> 3 in [1, 2, 3, 4, 5] True – Existe um substring no string? >>> 'sub' in 'string' False – Valores booleanos legível e operadores lógicos >>> a = True >>> not a False >>> 'sub' not in ['string', 'hello', 'world'] True 5 Porque Python é tão perfeito para Ciência? • Indexação? Posicionamento! – Blocos de códigos são definido por sua indexação ou recuo. – Não existe explicitadamente begin ou end, e nem chaves para informar onde o bloco começa ou termina. O delimitador é dois pontos (:) e a indexação (recuo) do código >>> for i in [1, 2, 3, 4, 5]: … if i<3: … print i … else: … print i*2 1 2 6 8 10 • Sintaxe-semântica simplista e clara • Código curtos = erros menores • Rápido desenvolvimento, entendimento, digitação, encontra erros e fácil modificar... 6 Porque Python é tão perfeito para Ciência? • • • • • • • • • • • • Um número grande de bibliotecas (libraries) Compressão e Arquivamento de dados Serviços de criptografia Protocolos da Internet Manipulação de dados da Internet Ferramenta de processamento Serviços Multimídia Internacionalização Ferramentas de desenvolvimento Multi-tendência (multithreanding) e multiprocessamento Expressões regularesInterfaces Gráficas com Tk ou Qt ... 7 Porque Python é tão perfeito para Ciência? • • • • • Bem documentado, Plataforma API independente, mas otimizada para cada plataforma, Um espaço para checar primeiro para testar uma solução, Reutilizar em vez de reinventar, Bibliotecas (módulos): – NumPy / SciPy – Estrutura de vetores e matrizes, rotinas de álgebra linear, otimização numérica, geração de números aleatórios, rotinas de estatísticas, modelagem de equações diferenciais, Transformadas de Fourier e processamento de sinal, processamento de imagem, matrizes , computação espacial, e outros infinidades de rotinas matemáticas – Matplotlib - biblioteca de plotagem 2D que produz figuras de qualidade de publicação através de um conjunto de funções familiar aos usuários do MATLAB – Interfaces para Matlab, Mathematica, o Maple, Octave ... – mplot3d kit de ferramentas (matplotlib), Mayavi2, … • Não há necessidade de mudar de linguagem, a fim de escrever código de manipulação de matriz, comunicar com um servidor web ou automatizar uma tarefa do sistema operacional .. 8 Porque Python é tão perfeito para Ciência? • Velocidade "Python é extramente lento e perde memória!" >>>import os >>>xvec = range(2000000) >>>yvec = range(2000000) >>>zvec = [0.5*(x+y) for x,y in zip(xvec,yvec)] >>>os.system("ps v "+str(os.getpid())) PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 16078 pts/0 S+ 0:00 12 2392 365675 341076 8.4 python 104 MB de memória usada! Correu em 8 segundos! 9 Porque Python é tão perfeito para Ciência? • Velocidade – Usando a ferramenta certa para o trabalho: Numpy >>>import os >>>from numpy import * >>>xvec = arange(2000000) >>>yvec = arange(2000000) >>>zvec = (xvec+yvec)*0.5 >>>os.system("ps v "+str(os.getpid())) – 37 MB memória usada! Executa cerca de 0.3s! 10 Porque Python é tão perfeito para Ciência? • Tempo de implementação vs tempo de execução: – Python é desenvolvido para produtividade – Não existe compilação (separado) – Não makefiles – Sem problema de vínculos – Rápido ciclos de desenvolvimento (Faster development cycles) • Quanto a velocidade de execução importantes alertas: – Uso de módulos especializados – Uso especilizado JIT compiler, Cython ... 11 Porque Python é tão perfeito para Ciência? • Interoperabilidade de linguagens • Python tem uma integração com outras linguagens: FORTRAN: F2py - Fortran para gerador da interface Python (part of NumPy) – Bibliotecas C ou C++: Cython, Ctypes, or SWIG são três caminhos para isso – R: RPy - simples, robusto interface Python para linguagem de Programação. Ele pode gerenciar todos os tipos de objetos R e pode executar funções R arbitrários (incluindo as funções gráficas). 12 Porque Python é tão perfeito para Ciência? • Livre, open source ( Python Software Foundation License) • Plataforma independente • Disponibilidade: Componente padrão para muitos sistemas operacionais • Amplamente aplicável – Pode ser usado com um terminal de calculadora – Pode substituir shell script – Pode ser criado para grande aplicações GUI – Pode ser usado para fazer testes numéricos no estilo do Matlab – Fácil para aprender – Iniciantes, e muito potente para usuários avançados – Alto nível de programação – Suporte para paradigmas de múltipla programação (object oriented, imperative and functional) 13 IPython • Melhorando a interatividade shell Python; Principal características – Introspecção dinâmica e ajuda(help) - Dynamic introspection and help – Busca através de módulos e namespaces – Tab complementação – Acesso completo ao sistema shell – Session logging & restoring – Impressões traceback exceção detalhado e coloridos – Debugger incluído – Altamente configurável, programáveis (Macros, Aliases) 14 IPython • Obtendo ajuda( Help) – Obter a ajudar para uma função In[1]: command? – Dê uma olhada na implementação: In[2]: command?? – Pesquisa variáveis,funções,módulos iniciando com 'ab': In[3]: ab<Tab> – Quais objetos são atribuídos In[4]: whos – Qualis os atributos-métodos estão lá? In[5]: object.<Tab> – Obter help para um object/class method/attribute: In[6]: object.command? 15 Começando – Tipos de dados: Números • Entrar em um terminal $python ou ipython Python 2.7.3 (default, Mar 13 2014, 11:03:55) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a = 17 >>> type(a) <type 'int'> >>> a / 10 1 >>> a % 10 7 >>> a / 10.0 1.7 >>> _ # resultado da ultima operacao. 1.7 >>> type(_) <type 'float'> 16 Começando – Tipos de dados: Números >>> a = 3.0 + 4.0j >>> float(a) Traceback (most recent call last): ... TypeError: can't convert complex to float >>> a.real 3.0 >>> a.imag 4.0 >>> abs(a) #sqrt(a.real ** 2 + a.imag ** 2) 5.0 17 Começando – Tipos de dados: Números >>> a = 17 >>> a = a + 1 >>> a 18 >>> a += 2 >>> a 20 >>> a++ a++ ˆ SyntaxError: invalid syntax - PS: Os números são imutáveis >>> a=5;b=a;a=6;a is b False 18 Tipos de dados: Conversão de Números >>> s = '13.8' >>> f = float(s) >>> i = int(s) ValueError: invalid literal for int() with base 10: '13.8' >>> i = int(f) >>> i 13 >>> complex(s) (13.8+0j) Division >>>p=3; q=6; p/q 0 >>>float(p)/q 0.5 19 Tipos de dados: string >>> 'nada' 'nada' >>> "doesn't" "doesn't" >>> 'doesn\'t' "doesn't" >>> '"Yes," he said.' '"Yes," he said.' >>> "\"Yes,\" he said." '"Yes," he said.' >>> '"Isn\'t," she said.' '"Isn\'t," she said.' 20 Tipos de dados: string >>> 'Georg' + 'e Sand' 'George Sand' >>> 'Sand' * 5 'SandSandSandSandSand'' >>> a = "Escola de Inverno" >>> a[0] 'E' >>> a[0:1] 'E' >>> a[1:5] 'scol' >>> a[-7:] 'Inverno' 21 Tipos de dados: string >>> a = 'SIg' >>> a[3] = 'G' # Os string não se altera !! Traceback (most recent call last): ... TypeError: 'str' object does not support item assignment >>> b = a[:-1] + 'G' >>> b 'SIG' >>> len(b) 3 22 Tipos de dados: string • Strings são objetos com muitos módulos ou métodos de uso: >>> a = "Escola de inverno 2015" >>> a.find(Escola) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'Escola' is not defined >>> a.find('inverno') 10 #ipython → -1 >>> a.split() ['Escola', 'de', 'inverno', '2015'] >>> '*'.join(_) 'Escola*de*inverno*2015' Existe mais módulos úteis como startswith, endswith,lower, upper, ljust, rjust, center, .... ver Python Library Reference. 23 Tipos de dados: Lists >>> a = ['chocoloate','ovo',100, 1234] >>> a ['chocolate', 'ovo', 100, 1234] >>> a[0] 'chocolate' >>> a[3] 1234 >>> a[-2] 100 >>> a[:2]+['bacon',2*2] ['chocolate', 'ovo', 'bacon', 4] >>> 2*a[:3]+['Boo!'] ['chocolate', 'ovo', 100, 'chocolate', 'ovo', 100, 'Boo!'] 24 Tipos de dados: Lists >>> a ['chocolate', 'ovo', 100, 1234] >>> a[2] = a[2] + 23 # listas são mutáveis >>> a ['chocolate', 'ovo', 123, 1234] >>> a[0:2]=[1,12] # substitui alguns itens >>> a [1, 12, 123, 1234] >>> a[0:2]=[] # remove alguns >>> a [123, 1234] >>> a[1:1]=['nada', 'legal'] # inseri alguns >>> a [123, 'nada', 'legal', 1234] 25 Tipos de dados: Lists • Importantes operações list: Acrescentando >>> arglist=[];arglist.append(myvar) Indexing >>> filename = arglist(0) Pesquisando >>> i = arglist.index(ʻtmp.psʼ) Apagando >>> del arglist[i] 26 Tipos de dados: Lists Slicing (cortando) >>> a = 'demonstrando slicing em Python'.split() >>> a[-1] # última entrada 'Python' >>> a[:-1] # tudo EXCETO a última entrada ['demonstrando', 'slicing', 'em'] >>>a[:] #tudo ['demonstrando', 'slicing', 'em', 'Python'] >>> a[2:] # tudo até menos as duas primeiras entradas ['em', 'Python'] >>>a[-2:] # duas últimas entradas ['em', 'Python'] >>> a[1:3] ['slicing', 'em''] >>> a[:0] = ('aqui gente').split() # como adicionar e inicio no começo da lista >>> a ['aqui', 'gente', 'demonstrando', 'slicing', 'em', 'Python'] • Existe mais módulos de list como append, insert, remove, sort, pop, index, reverse,....veja Python Library reference 27 Tipos de dados: Tuples, Boolean, None • Tuple: Listas imutáveis criado por parênteses aleatórios >>> t = (12345, 54321, 'hello!') >>> t[0] 12345 >>> type(t) <type 'tuple'> • Boolean: >>> type(True) <type 'bool'> • None: >>> a = None >>> type(a) <type 'NoneType'> 28 Tipos de dados: Dictionary >>> tel = {'ze':4098, 'maria':4139} >>> tel {'ze': 4098, 'maria': 4139} >>> tel['ze'] 4098 >>> del tel['maria'] >>> tel['maria']=4127 >>> tel {'ze': 4098, 'maria': 4127} >>> tel.keys() ['ze', 'maria'] >>> 'ze' in tel True 29 Tipos de dados: Dictionary • Importantes operações usando dictionary: >>> d = {'dt': 10, 'xd': 20} >>> d['dt'] #chave dt 10 >>> d.keys() # retorna a lista de chaves ['dt', 'xd'] >>> d.has_key('dt') # pesquisa pela chave específica True >>> d.get('dt',1.0) # olha para o valor 'dt' se não existe colocar o valor default 1.0 10 >>> d.get('gt',1.0) 1.0 >>> d.items() #lista os conteúdos de dictionary como lista de tuples. [('dt', 10), ('xd', 20)] 30 Tipos de dados: NumPy Arrays • Precisamos importa o módulo numpy para os seguintes exemplos: >>> import numpy as np >>> from numpy import * >>> a = array([2, 3, 4]) >>> a array([2, 3, 4]) >>> type(a) <type 'numpy.ndarray'> >>> b = array([(1.5, 2, 3),(4,5,6)]) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]]) 31 Tipos de dados: NumPy Arrays >>> b.ndim # numero de dimensões 2 >>> b.shape # as dimensões (2, 3) >>> b.dtype # o tipo (8 bytes floats) dtype('float64') >>> b.itemsize # O tamanho do tipo 8 >>> c = np.array([[1,2],[3,4]], dtype=complex) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]]) 32 Tipos de dados: NumPy Arrays >>> np.zeros((3,4)) array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) >>> np.ones((2,3,4), dtype=int) array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]]) Tipos de dados: bool, uint8, uint16, uint32, uint64, int8, int16, int32, int64,float32, float64, float96, complex64, complex128, complex192 33 Tipos de dados: NumPy Arrays >>> np.arange(10,30,5) array([10, 15, 20, 25]) >>> np.arange(0,2,0.3) # aceita argumentos float array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]) >>> np.linspace(0,2,9) # 9 números entre 0 a 2. array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ]) >>> x = np.linspace(0, 2*np.pi,100) >>> f = np.sin(x) ….... 34 Tipos de dados: NumPy Arrays NOTE: Observe a diferença entre Lists e Numpy Arrays quando cortamos(slicing): >>> a = [10,20,5] >>> b = a # b is refereciando a >>> b is a True >>> a[2] = 30 >>> b = a[:] # Isso é uma copia de a >>> a == b True # b é uam copia de a >>> a is b False >>> b[1] = 30 >>> b == a False 35 Tipos de dados: NumPy Arrays NOTE: Observe a diferença entre Lists e Numpy Arrays quando cortamos(slicing): >>> from numpy import * >>> a = asarray(a) # faça um array da lista a >>> b = a # b está referenciando a >>> b is a True >>> b = a[:] >>> b[2] = 80 >>> b == a array([ True, True, True], dtype=bool >>> b = a.copy() # this is now a true copy >>> b == a #b is a gives a False True >>> b[2] = 90 >>> b == a False ----> array([ True, True, False], dtype=bool 36 Tipos de dados: NumPy Arrays >>> A = np.array([[1,1],[0,1]]) >>> B = np.array([[2,0],[3,4]]) >>> A * B # produto de elementos da matriz array([[2, 0], [0, 4]]) >>> np.dot(A,B) #produto de matrizes array([[5, 4], [3, 4]]) >>> np.mat(A) * np.mat(B) # produto de matrizes matrix([[5, 4], [3, 4]]) • Existem outras funções para a criação de matriz, conversões, manipulação, consulta, pedidos, operações, estatística, álgebra linear básica. Consulte a documentação NumPy. 37 Gráfico:Matplotlib • Matplotlib é a biblioteca gráfica do Python. – Sintaxe é muito próxima dos comandos gráficos do Matlab – Usuários avançados pode controlar todos os detalhes dos gráficos (plots). • Precisamos importar matplotlib para os seguintes exemplos: >>> import matplotlib.pyplot as plt >>> import numpy as np >>> x = [0, 2, 2.5] >>> plt.plot(x); [<matplotlib.lines.Line2D object at 0x42e54d0>] >>> plt.show() >>> x = [0, 2, 2.5] >>> y = [3, -3.5, -1] >>> plt.plot(x, y, 'r--o') [<matplotlib.lines.Line2D object at 0x42cac10>] >>> plt.show() 38 Gráfico:Matplotlib >>> import matplotlib.pyplot as plt >>> import numpy as np >>> t = np.arange(0.0, 2.0, 0.01) >>> s = np.sin(2 * np.pi * t) >>> plt.plot(t, s, linewidth=1.0) [<matplotlib.lines.Line2D object at 0x2c04c90>] >>> plt.xlabel('tempo (s)') <matplotlib.text.Text object at 0x28cf750> >>> plt.ylabel('voltagem (mV)') <matplotlib.text.Text object at 0x28d4190> >>> plt.title('Gráfico simples') <matplotlib.text.Text object at 0x2be8fd0> >>> plt.grid(True) >>> plt.show() Consulte o site do matplotlib para os comandos básicos de plotagem e especialmente a Galeria da matplotlib para muitos, muitos exemplos de gráficos com código fonte! 39 Controle de fluxo: if >>> x = int(raw_input("Por favor entre com um inteiro: ")) Por favor entre com um inteiro: 42 >>> if x < 0: ... print 'negativo' ... elif x == 0: ... print 'Zero' ... elif x == 1: ... print 'unitario' ... else: ... print 'Mais' ... Mais 40 Fluxo de controle: for >>> a = ['gato', 'janela', 'portaria'] >>> for x in a: ... print x, len(x) ... gato 4 janela 6 portaria 8 >>> for i in range(0,6,2): ... print i ... 0 2 4 41 Fluxo de controle: while >>> import time >>> i = 1 >>> while True: ... i = i*1000 # o mesmo que i *= 1000 ... print repr(i) ... time.sleep(1) #espere um segundo ... 1000 1000000 1000000000 1000000000000 1000000000000000 1000000000000000000 1000000000000000000000L 42 Fluxo de controle: continue & break • O comando break – quebrar, rompe ….loop for ou while >>> for i in range(0, 100000): ... if i> 50: ... print i ... break ... 51 • O comando continue mantem com a próxima interação do loop >>> for i in range(0, 100000): ... if i!= 50: ... continue ... print i ... 50 43 Funções • Definindo uma função que retorna uma série de Fibonacci até n. >>> def fib2(n): ... """ Retorna a serie de Fibonacci até n.""" ... result=[] ... a,b = 0,1 ... while a < n: ... result.append(a) ... a, b = b, a+b ... return result ... • Podemos chamar a função que definimos: >>> fib2(100) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 44 Funções >>> def parabens(nome, idade=1): ... if idade < 40: ... msg = "Parabens, %s! Vc ainda é jovem por esta com %d de idade" ... else: ... msg = "Oi, %s! Ta no hora dos exames sua idade de %d anos diz que hora meu amigo" ... print msg %(nome, idade) ... >>> parabens("Julia") Parabens, Julia! Vc ainda é jovem por esta com 1 de idade >>> parabens(idade=8, nome="Julia") Parabens, Julia! Vc ainda é jovem por esta com 8 de idade >>> parabens("Sand",43) OI, Sand! Ta no hora dos exames sua idade de 43 anos diz que hora meu amigo 45 Python in & out: manipulação de arquivos • Use open(nomedoaquivo, modo) para abrir o aquivo. Retorna um arquivo “Object”. “open(filename, mode) “ fh = open('/home/filename','r') • Alguns possíveis modos – r: abre o arquivo texto para ler. – w: abre o arquivo texto para escrever. – a: abre o arquivo texto para adicionar (anexar). – rb: abre arquivo binário para ler. – wb: abre arquivo binário para escrever. • Use Close() para fechar o arquivo Object fh,close() 46 Python in & out: manipulação de arquivos • Ler a quantidade de dados de um arquivo: >>> fh = open('/home/analistas/myarray.txt','r') >>> s = fh.read(size) # size: números de bytes para ler • Ler todo o arquivo: >>> s = fh.read() • Ler uma linha do arquivo: >>> s = fh.readline() • Obter todas linhas de datas do arquivo para uma lista: >>> list = fh.readlines() • Iterar cada linha no arquivo: >>> for line in fh: ... print line, 47 Python in & out: salvando arquivos • Escrever um string no arquivo >>> fh = open('teste.txt','w') >>> mystring = "NADA" >>> fh.write(mystring) • Escrever strings para o arquivo >>> mysequence = ["ovos", "presunto", "nada"] >>> fh.writelines(mysequence) >>> fh.close() >>> import os >>> os.system('more teste.txt') NADAovospresuntonada 48 Python in & out: Lendo e escrevendo arquivos de dados ASCII >>> import numpy as np • Escrever um vetor no formato ASCII para um arquivo: >>> x = np.arange(0, 1.4, 0.2) >>> x array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2]) >>> np.savetxt('myarray.txt', x) • Carregar dados ASCII de um arquivo de vetor : >>> x2 = np.loadtxt('myarray.txt') >>> x2 array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2]) • Formato ASCII pode ser manipulado, veja help: >>> help(np.savetxt) ou np.savetxt? ----> ipython 49 Python in & out: Lendo e escrevendo arquivos de dados ASCII • Escrever mais que de uma serie temporal para um arquivo: >>> y = np.cos(x) >>> np.savetxt('myarray2.txt', [x, y]) >>> z = np.column_stack([x, y]) >>> z array([[ 0. , 1. ], [ 0.2 , 0.98006658], [ 0.4 , 0.92106099], [ 0.6 , 0.82533561], [ 0.8 , 0.69670671], [ 1. , 0.54030231], [ 1.2 , 0.36235775]]) >>> np.savetxt('myarray3.txt', z) 50 Python Erros & Exceções: Exceções >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero >>> 4 + muh*3 Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'muh' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects 51 Python Erros & Exceções: Exceções manipulação >>> def divide(x, y): ...: try: ...: result = x / y ...: except ZeroDivisionError: ...: print "division by zero!" ...: except TypeError: ...: print "unsupported type!" ...: else: ...: print "result is", result >>> divide(2, 1) result is 2 >>> divide(2, 0) division by zero! >>> divide(2, 'bbb') unsupported type! 52 Numpy • www.numpy.org – É um pacote de ferramenta para computação científica com python. Contém, entre outras coisas: • • • • Poderosa um objeto de matriz N-dimensional poderosa funções sofisticadas ferramentas para a integração de código C / C ++ e Fortran álgebra linear útil, transformada de Fourier, e capacidades de números aleatórios – Para além das suas utilizações científicas óbvias, NumPy também pode ser utilizado como um recipiente multi-dimensional eficiente de dados genéricos. Tipos de dados arbitrários podem ser definidos. Isso permite que NumPy, de forma transparente e rápida integração com uma ampla variedade de bancos de dados. 53 Numpy • Primeiro importa o módulo numpy >>> import numpy as np • Então uma função func do numpy precisa escrever como np.func. >>> from numpy import * >>> np.<TAB> • np.lookfor? Ou help(np.lookfor) 54 Numpy - Vetor ou Matriz de uma dimensão • np.linspace • numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) num é opcional (int), número de amostras geradas, default é 50. endpoint (bool) se True, para na última amostra.???? retstep – se True, (amostras, passo), retorna o passo é espaçamento entre amostras dtype – o tipo de saída do vetor/matriz (array) [dtype=complex, float, int, ...] SAÍDA (retorna) Amostras igualmente espaçadas no intervalo fechado [start, stop] ou o intervalo semiaberto [iniciar, parar) (dependendo se endpoint é verdadeiro ou falso). • Exemplos >>> from numpy import * >>> np.linspace(2.0, 3.0, num=5) array([ 2. , 2.25, 2.5 , 2.75, 3. ]) >>> np.linspace(2.0, 3.0, num=5, endpoint=False) array([ 2. , 2.2, 2.4, 2.6, 2.8]) >>> 55 Numpy - Vetor ou Matriz de uma dimensão • np.range, np.zeros e np.array numpy.arange([start, ]stop, [step, ]dtype=None) >>> np.arange(1,10) array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(1,10,dtype=complex) array([ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j, 8.+0.j, 9.+0.j]) numpy.zeros(shape, dtype=float, order='C') >>> np.zeros(10,dtype=float) array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> np.zeros((2,2)) array([[ 0., 0.], [ 0., 0.]]) 56 Numpy - Vetor ou Matriz de uma dimensão numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0) object : array_like copy : bool, optional se True (default), então o object será copiado >>> la = np.array([1,2,3,4]) >>> la array([1, 2, 3, 4]) >>> x = np.linspace(0,1,11) >>> x array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]) >>> cx = np.array(x, dtype=complex) >>> cx array([ 0.0+0.j, 0.1+0.j, 0.2+0.j, 0.3+0.j, 0.4+0.j, 0.5+0.j, 0.6+0.j, 0.7+0.j, 0.8+0.j, 0.9+0.j, 1.0+0.j]) 57 Funções universais(Ufuncs) • http://docs.scipy.org/doc/numpy/reference/ ufuncs.html • sign, cos, cosh, exp, power, angle, abs, fix, log...... → np.sign? 58 Operadores lógicos • x<0, se x for escalar está ok, e o resultado será True ou False. >>> x=np.linspace(-2,2,401) >>> y=x<0 >>> x >>> y Função select -np.select([C0,C1,C2],[R0,R1,R2],default=0) >>>x=np.linspace(-1,3,9) >>>y=np.select([ x>=2, x>=1, x>0, x<0], [ 4.0, x**2, x**3, -x]) Existe também np.piecewise 59 Vetor e Matrizes (revisao) >>> x=np.array([[0,1,2,3],[10,11,12,13],[20,12,22,23]]) >>> x.ndim >>> x.shape >>> x.dtype >>> x array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 12, 22, 23]]) >>> x[2] array([20, 12, 22, 23]) >>> x[ : ,1] array([ 1, 11, 12]) >>> x[2][1] 12 >>> x[2,1] 12 60 Operações básicas >>> x = np.array([2,4,3], float) >>> x.sum() 9.0 >>> x.prod() 24.0 >>> np.sum(x) 9.0 >>> x.mean() 3.0 >>> x.var() 0.66666666666666663 >>> x.std() 0.81649658092772603 x.min(), x.max() np.?????? (unique, diagonal,sorted....) >>> x = np.array([[0,2], [3,-1], [3,5]],float) >>> x.mean(axis=0) array([ 2., 2.]) >>> x array([[ 0., 2.], [ 3., -1.], [ 3., 5.]]) >>>x.mean(axis=1) array([ 1., 1., 4.]) >>> x.min(axis=1) Array([ 0.,-1., 3.]) >>> x.max(axis=0) array([ 3., 5.]) 61 Seleção e manipulação >>> x = np.array([[6, 4], [5, 9]], float) >>> x >= 6 array([[ True, False], [False, True]], dtype=bool) >>> x[x >=6] array([ 6., 9.]) Mais complicado um pouquinho >>> x[np.logical_and(x > 5, x< 9)] array([ 6.]) >>> x = np.array([2, 4, 6, 8], float) >>> y = np.array([0, 0, 1, 3, 2, 1], int) >>> x[y] array([ 2., 2., 4., 8., 6., 4.]) → get position x.take e x.put............. 62 Calculo de Matriz e vetores >>> a = np.array([1, 4, 0], float) >>> b = np.array([2, 2, 1], float) #Multiplicação, outer, inner e cross >>> np.dot(a,b) 10.0 >>> np.outer(a,b) array([[ 2., 2., 1.], [ 8., 8., 4.], [ 0., 0., 0.]]) >>> np.inner(a,b) 10.0 >>> np.cross(a,b) array([ 4., -1., -6.]) • Numpy vem com uma série de rotinas internas para calculo de álgebra linear, que pode ser encontradas no sub-módulo linalg. >>> x = np.array([[4, 2, 0], [9, 3, 7], [1, 2, 1]], float) >>> x array([[ 4., 2., 0.], [ 9., 3., 7.], [ 1., 2., 1.]]) >>> np.linalg.det(x) -48.000000000000028 >>>np.linalg.eig(x) np.linalg.inv(x), np.linalg.svd ... 63 Polinômios >>> roots=[0,1,1,2] >>> coeffs=np.poly(roots) >>> coeffs array([ 1, -4, 5, -2, 0]) >>> np.roots(coeffs) array([ 2. +0.00000000e+00j, 1. +2.83263462e-08j, 1. -2.83263462e-08j, 0. +0.00000000e+00j]) …. 64 Estatísticas e aleatórios >>> x=np.array([1,4,3,8,9,2,3], float) >>> np.median(x) 3.0 >>> a = np.array([[1, 2, 1, 3], [5, 3, 1, 8]], float) >>> np.corrcoef(a) array([[ 1. , 0.72870505], [ 0.72870505, 1. ]]) >>> np.random.rand(5) → aleatório array([ 0.33677247, 0.52693437, 0.79529578, 0.78867702, 0.02147624]) >>> np.random.rand(2,3) array([[ 0.84612516, 0.0704939 , 0.1526965 ], [ 0.77831701, 0.80821151, 0.82198398]]) >>> np.random.random() 0.9023965286127028 >>> np.random.randint(5, 10) 5 65 Gráficos • Gráfico simples >>> import matplotlib.pyplot as plt >>> import numpy as np >>> x = np.linspace(-np.pi,np.pi,101) >>> y = np.sin(x)+np.sin(3*x)/3.0 >>> plt.ion() >>> plt.plot(x,y) [<matplotlib.lines.Line2D object at 0x3467dd0>] >>> plt.savefig('foo.pdf') #plt.show ou plt.,ion() para o saída do gráfico. Para …. 66 Gráficos cartesianos 67 Gráficos cartesianos >>> import pagina67 68 Grafico POLAR 69 Barras de erros 70 Texto e Anotações 71 Contornos 72 Varios Graficos 73 Varios Graficos 74 Animações 75 Videos 76 Por hoje é só 77