Python para oceanógrafos/Colinha
Este livro ou módulo precisa ser formatado segundo o modelo wiki e/ou organizado conforme as convenções do Wikilivros. (discuta) Por favor ajude a formatar este módulo de acordo com as diretrizes estabelecidas no livro de estilo. Editor: considere colocar o mês e o ano da marcação. |
BREVE GUIA DE PYTHON ESCRITO POR AMADOR
Observação importante: Neste guia podem (!) conter informações erradas.
INTRODUÇÃO
editarTipos de variáveis:
- int: 5 } - float: 5.0 } --> Usar a função type(variavel). - str: '5.0' ou "5.0" } - complex: 5 + 0j }
Objetos importantes:
- lista: l = [1, 2, 3] - tuple: t = (1, 2, 3) ou (1,) - dicionário: d = {'a': [1, 2, 3], 'b': [4, 5, 6]}
Observações dos objetos:
- "Lists are mutable, strings and tuples are immutable." - "a == b" retorna True se eles têm o mesmo valor. - "a is b" retorna True se eles são a mesma coisa (ocupam o mesmo espaço na memória). - d['a'] retorna [1, 2, 3] - d['b'][1] retorna 5 - d.keys() retorna ['a', 'b'] - d.values() retorna [[1, 2, 3], [4, 5, 6]]
Uso do help: help(<comando>) Ajuda também: <comando>? Para ver o código de uma função: <comando>??
- --> Comentário.
ESPECIFICAÇÕES INICIAIS E IMPORTAÇÃO DE BIBLIOTECAS
editar"# -*- coding: utf-8 -*-" --> (Sem aspas, na primeira linha do algoritmo) possibilita a utilização de acentos gráficos no algoritmo. from __future__ import division # Razão entre inteiros se torna real. from pylab import * # Não é recomendável importar tudo da biblioteca; escrevi para lembrar! import numpy as np # Numerical Python. from matplotlib import pyplot as plt # Matplotlib.
u'string' --> Leitura do string como unicode. r'string' --> Leitura do string como raw. Obs: Dá pra usar os comandos do Latex na escrita de textos!
& --> E. | --> Ou. = --> Atribuição. == --> Comparação de igualdade. != --> Comparação de diferença.
- LIMPEZA DA CASA:
- del a, b, c # Descomentar para apagar possíveis variáveis.
plt.close('all') # Fechamento das figuras abertas. clear # Limpeza da linha de comando.
COMANDOS GERAIS
editarrun script.py --> Roda o algoritmo no Terminal. paste --> Idem a Ctrl+V. who --> Lista de variáveis. whos --> Lista de variáveis com descrição.
print('Texto') --> Escreve o texto na linha de comando. str(3) --> Idem ao num2str do Matlab. str1 + str2 --> Concatenação de strings. 'exemplo %d de string' % 4 --> Isso tudo é o string: 'exemplo 4 de string'; usar o formato "string % variável". %6.2f --> 2 algarismos depois da vírgula (já arredondado) e ocupando 6 caracteres ao todo. \n --> Mudar de linha. Obs: Dá pra usar os comandos do Latex na escrita de textos!
a[-1] --> Refere-se ao último elemento de a. b = a[:] --> b vira uma cópia de a ("a == b" retorna True e "a is b" retorna False). "a = 3; b = 4;" --> Pode ir na mesma linha. Dá pra fazer por tuple também.
range(a) --> Lista de 0 até (a-1) de 1 em 1. range(a, b) --> Lista de a até (b-1) de 1 em 1. range(a, b, n) --> Lista de a até b de n em n (exclusive b). np.arange(a, b, n) --> Matriz de a até b de n em n (exclusive b). np.linspace(a, b, n) --> Matriz de a até b com n elementos (b incluso). np.array([1, 2, 3]) --> Matriz unidimensional. np.array([[1, 2],[3, 4]]) --> Matriz bidimensional.
m.sum() == np.sum(m) --> Quando 'm' é matriz. m.shape --> Retorna um tuple com as dimensões da matriz. m.size --> Retorna o número de elementos de uma matriz.
if, elif e else --> Começar com if; usar quantos elif quiser; else é opcional.
for <variável> in <lista>: --> Loop. Não há um "end". Uso da identação!
np.savez('vars', x, y, z) dat = np.load('vars.npz') a = dat['arr_0'] b = dat['arr_1'] c = dat['arr_2'] (a, b, c) = (dat['arr_0'], dat['arr_1'], dat['arr_2']) x, y, z podem ser números, matrizes, listas ou strings; o np.load sempre retornará matrizes (a, b, c serão matrizes). Deve ter um jeito mais inteligente de se fazer isso. Obs: Não sei se é com esse mesmo procedimento, mas é possível ler arquivos .mat.
p = np.loadtxt(<string do caminho do arquivo>, skiprows = 20, usecols = (2,)) --> Leitura de arquivo ASCII.
plt.show() --> Mostra figura em questão. plt.close() --> Fecha a figura em questão. fig = gcf() --> Faz um handle da figura em questão. ax = gca() --> Faz um handle do eixo em questão.
EXEMPLO DE CONFECÇÃO DE FUNÇÃO
editardef pitagoras(a, b): c = np.sqrt(a**2 + b**2) return c
Obs: A ser colocada no início dos algoritmos.
EXEMPLO DE UM PLOT SIMPLES BEM FEITO
editarfig, ax = plt.subplots(figsize=(7, 5)) ax.plot(x, y, '--b', label='Seno', linewidth=2) # Label é a legenda. ax.plot(2, 1, 'or', label='Cosseno', markersize=12) # Label é a legenda. legend(loc='upper left')
xlim(-5, 5) xticks([-np.pi, 0, np.pi], [r'$-\pi$', r'$0$', r'$\pi$']) ylim(-10, 10) yticks(linspace(-1, 1, 3), [r'$-1$', r'$0$', r'$1$'])
ax.set_title('Título') ax.set_ylabel('Imagem') ax.set_xlabel('Dominio') fig.savefig('name.png', transparent=True)
5.1 Mudança na posição dos eixos (origem):
ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))
5.2 Alternativa para definição do tamanho da figura: usar o comando fig.get_size_inches.
5.3 Inversão de eixos (para plotagens de perfis!): ax.invert_yaxis()
5.4 Plotando circulos: plt.scatter(x, y, <tamanho>, 'k', edgecolor = 'none', alpha = 0.5)
EXEMPLOS DE COMANDOS ESPECÍFICOS
editar6.1 Trabalhando com tempo:
from datetime import datetime, timedelta
d1 = datetime(1991, 7, 30) d2 = datetime(1995, 2, 15) dt = d2 - d1 --> dt será datetime.timedelta(1296)
dt = timedelta(days = 2, hours = 3)
6.2 Trabalhando com mapas:
Google: "matplotlib basemap" from mpl_toolkits.basemap import Basemap help(Basemap) --> Há um exemplo! map = Basemap([...]) --> Lembrar que map é um objeto e que "map."+TAB é útil.
BIBLIOTECAS
editarPadrão: from __future__ import division # Razão entre inteiros se torna real. import numpy as np # Numerical Python. from matplotlib import pyplot as plt # Matplotlib.
Módulos da "Standard library" do Python: import os # Operation System. from glob import glob # "Globbing" de arquivos.
Manipulação de netCDF (local/remoto): from netCDF4 import Dataset
Mapas: from mpl_toolkits.basemap import Basemap, shiftgrid, cm
OBS: Não usar a seawater, ela está obsoleta! Usar a gsw (GibbsSeaWater).
INSTALAÇÃO
editarO Python já vem com o Ubuntu. Baixar (via Ubuntu Software Center): Ipython, Matplotlib, Numpy, Scipy, Basemap.
A biblioteca básica para oceanografia é a gsw (GibbsSeaWater).
Opcional: atualizar o .bashrc com o exemplo abaixo:
- Ipython alias:
alias py='ipython'
8.1 Baixar pacotes (roteiro usado somente para o EPD?):
1. Criar a pasta "modules" na pasta do Python. 2. Escrever no .bashrc: "export PYTHONPATH=$PYTHONPATH$HOME/softwares/python/modules". 3. Google: python seawater (por exemplo). 4. No site certo, clicar em "Source" e copiar o "command line access" para o Terminal. 5. (Precisa ter o Mercurial instalado.) 6. Fazer um link simbólico com: "$ ln -s /home/usuario/softwares/python/modules/python-seawater/seawater /home/usuario/python/modules/seawater". 7. Conferir se o link simbólico foi feito.
EXEMPLO DE COMEÇO DE ALGORITMO
editar- -*- coding: utf-8 -*-
- PLOTAGEM DE PERFIL DE OXIGÊNIO DISSOLVIDO
- Autor: [...]
- Data: 22/jan/2013
- E-mail: [...]
- IMPORTAÇÃO DE BIBLIOTECAS:
from __future__ import division # Razão entre inteiros se torna real. import numpy as np # Numerical Python. from matplotlib import pyplot as plt # Matplotlib.
- LIMPEZA DA CASA:
- del a, b, c # Descomentar para apagar possíveis variáveis.
plt.close('all') # Fechamento das figuras abertas. clear # Limpeza da linha de comando.