quinta-feira, 1 de novembro de 2012

Loops 'tradicionais'

Meu camarada Irber, relembrando como fazer um loop 'tradicionalista' onde se pegam os índices dos ítens de uma lista ou de um numpy array, usando o enumerate, para pegar o valor e seu "índice".

Buscando, dessa forma, um loop tradicionalista, porém mais pythonico (eu acho).
valores = ([1,3,5,7,9])
for i, value in enumerate(valores):
    print i, value

Out[2]:
0 1
1 3
2 5
3 7
4 9
Sendo o jeito um tanto mais "conservador" e talvez menos pythonico:
for i in xrange(len(valores)):
    print i, valores[i]

Out[4]:
0 1
1 3
2 5
3 7
4 9
Até mais.

sexta-feira, 28 de setembro de 2012

Livros II - Oceanic Sciences and Hydrology

Um livro interessante, sobre Python aplicado às ciências atmosféricas e oceânicas.
A Hands-On Introduction to Using Python in the Atmospheric and Oceanic Sciences
Outro livro bacana é sobre a utilizacão do Python em hidrologia.
Python in Hydrology
Boas leituras.

terça-feira, 31 de julho de 2012

Livro: Estudos Oceanográficos

Está disponível para download o livro:
Estudos Oceanográficos - do instrumental ao prático
Organizado pelo Professor Danilo Calazans - FURG.

Outros livros estão disponíveis no site do Ciências do Mar.

Boas leituras!

sexta-feira, 8 de junho de 2012

Papers - Oceanography and Python


Dando parabéns aos Oceanógrafos pelo "dia do Oceanógrafo", seguem algumas leituras do dia de hoje.

[1] - Geophysical data analysis using Python - Computers & Geosciences (2002)
[2] - OOFɛ: A Python engine for automating regional and coastal ocean forecasts - Environmental Modelling & Software (2011)

Encontrei esse trabalho[1] dos Bascos autores do PyClimate (Jon Sáenz, Juan Zubillaga, Jesús Fernández), falando sobre o pacote PyClimate e a implementação de ferramentas básicas para a oceanografia.

Funções de distribuição de probabilidades (PDF's), método de EOF e SVD, uso de netCDF, como trabalhar com dias julianos nas convenções do Cooperative Ocean/Atmosphere Research Data Service (COARDS), filtros multivariados e outros detalhes.

O segundo trabalho[2] é um pacote de ferramentas para trabalhar com o ROMS automatizar previsões costeiras entre outras coisas. Uma demostração do que já é aplicado no Brasil está aqui: http://oceano.fis.ufba.br/oof/main/forecast.php
Ainda não disponibilizado o código (não sei o porquê ainda), mas ele referencia outras ferramentas da modelagem que integram o FORTRAN, como o a implementação do modelo atmosférico Neelin-Zeng QTCM1 (feito já em python http://www.johnny-lin.com/py_pkgs/qtcm/ ).

Anexos:
[1]
[2]

Boas leituras.

sábado, 5 de maio de 2012

Python pra Oceanógrafos

Aqui vão alguns módulos para trabalhar com dados oceanográficos.

oceans # http://pypi.python.org/pypi/oceans/
seawater # http://pypi.python.org/pypi/seawater/2.0.1
pyclimate # http://www.pyclimate.org/
pyhdf # http://pysclint.sourceforge.net/pyhdf/
pupynere # para trabalhar com netcdf (http://pypi.python.org/pypi/pupynere/1.0.15 )
puppy # http://pypi.python.org/pypi/Puppy/0.1.4
pydap # http://pydap.org/
pandas # http://pandas.pydata.org/
rpy2 # http://rpy.sourceforge.net/
f2py # http://www.scipy.org/F2py
GDAL # http://www.gdal.org/
pyModis # https://github.com/lucadelu/pyModis

E vai o link do wiki_livros, para você que já é experiente no uso... ajuda lá! =]
http://pt.wikibooks.org/wiki/Python_para_oceanógrafos

Problemas para compilar. Python.h

Estava encontrando erro (Python.h: No such file or directory), para vários arquivos distintos, dependendo do pacote que ia instalar com o pip.

Fiz uma busca e não encontrei respostas para os pacotes que apresentavam problemas na compilação.
Em específico para a instalação do Pyclimate em uma das máquinas.
src/JDTime_wrap.c:44:20: fatal error: Python.h: Arquivo ou diretório não encontrado

Para resolver isso:
#!/bin/bash
aptitude install python-dev
Instalará os headers e você poderá compilar normalmente.
Espero que ajude!

sábado, 28 de abril de 2012

Subset MODIS-Aqua (Clorofila-a)

Pegando o gancho com uma postagem [1] que já tinha guardada de um tempo e do pacote pyMODIS [2], resolvi fazer o meu subset de imagens MODIS em Python.

Para esse código, foram testadas apenas imagens L3 de Clorofila-a, já processadas pela agência espacial norte americana (NASA).

Para executar esse código, você precisará de uma imagem: Imagem MODIS de 9km.

Dê um bunzip2 no seu diretório, onde estão as imagens .bz2, para que o código abaixo identifique somente as imagens sem a extensão (.bz2).

Um detalhe, é que abaixo segue como fazer o processo em batelada, mas para o exemplo de uma imagem, já é possível visualizar a coisa.

Diferentemente do post [1], não encontrei dificuldades em utilizar os dados. Logo não fiz uma conversão em ascii e nem utilizei o HDFview.

[1] http://www.trondkristiansen.com/?page_id=479
[2] https://bitbucket.org/tylere/pymodis/overview

#/usr/bin/env python
# -*- coding: utf-8 -*-

'''
subset_MODIS

Programa para Fazer um subset de imagens MODIS
Dentro dos limites Lat e Long determinados.

Author =  Arnaldo Russo
e-mail =  arnaldorusso@gmail.com
'''
from pyhdf.SD import *
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
import glob

#setting limits to be cut
LATLIMS = ([-40, -30])
LONLIMS = ([-40, -30])

indir = '/DATA/database/Images/L3/9km/'
outdir = '/DATA/database/Images/L3/resize/'

filelist = glob.glob(indir+'A*')
nfiles = len(filelist)
files = []
for path in filelist:
  files.append(path[len(indir):]) #remove path name

names = []
multi_img = []
for i in range(len(filelist)):
    A = SD(filelist[i])
    a = A.attributes()
    for k in xrange(0,len(a.keys())):
        nm = a.keys()[k]
        names.append(nm.replace(" ","_"))
    pin = dict(zip(names,a.values()[:]))
    lon = np.arange(pin['Westernmost_Longitude'],pin['Easternmost_Longitude'],pin['Longitude_Step'])
    lat= np.arange(pin['Northernmost_Latitude'],pin['Southernmost_Latitude'],-pin['Latitude_Step'])
    #Get the indices needed for the area of interest
    ilt = np.int(np.argmin(np.abs(lat-max(LATLIMS)))) #argmin catch the indices
    ilg = np.int(np.argmin(np.abs(lon-min(LONLIMS)))) #of minor element
    ltlm = np.int(np.fix(np.diff(LATLIMS)/pin['Latitude_Step']+0.5))
    lglm = np.int(np.fix(np.diff(LONLIMS)/pin['Longitude_Step']+0.5))
    #retrieve data SDS
    d = A.datasets()
    sds_name = d.keys()[0] #name of sds. Dictionary method.
    sds = A.select(sds_name)
    #load the subset of data needed for the map limits given
    P = sds[ilt:(ilt+ltlm),ilg:(ilg+lglm)]
    P[P==-32767]=np.nan #Rrs_670:bad_value_scaled = -32767s ;
    P=np.double(P)
    P=(pin['Slope']*P+pin['Intercept'])
    LT=lat[ilt+np.arange(0,ltlm-1)]
    LG=lon[ilg+np.arange(0,lglm-1)]
    Plg,Plt = np.meshgrid(LG,LT) #Further plots
    P = np.log(P) #chlorophyll mapping
    multi_img.append(P)


multi_img = np.asarray(multi_img)
plt.imshow(P)
plt.show()

### Save matrix
np.save("multi_img",multi_img)
# If you want to share with your Matlab friends Users =]
scipy.io.savemat(outdir+'multi_matrix.mat', mdict={'multi_img': multi_img})


Resultando nessa imagem de Clorofila-a