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

editar

Tipos 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>??

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

  1. LIMPEZA DA CASA:
  2. 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

editar

run 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

editar

def 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

editar

fig, 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

editar

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

editar

Padrã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

editar

O 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:

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

  1. -*- coding: utf-8 -*-
    1. PLOTAGEM DE PERFIL DE OXIGÊNIO DISSOLVIDO
    2. Autor: [...]
    3. Data: 22/jan/2013
    4. E-mail: [...]


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


  1. LIMPEZA DA CASA:
  1. del a, b, c # Descomentar para apagar possíveis variáveis.

plt.close('all') # Fechamento das figuras abertas. clear # Limpeza da linha de comando.