PDA

View Full Version : [Python] Somma elementi di una colonna in file .fits


SoONicK
14-02-2013, 10:02
Salve a tutti.
Sto scrivendo un codice python che mi permetta di cercare una periodicita' nei dati di un file.
Per far questo avevo intenzione di sommare i primi 50 dati presenti nella prima colonna della tabella e vedere se la somma e' uguale, entro un certo errore, alla somma dei 50 dati che si trovano dopo un certo lasso di tempo (periodo).
Il problema che trovo ora e' che non so come sommare solo i primi 50 dati.
Per lavorare con i file .fits c'e' bisogno di PyFits:


...
import pyfits
...
data=pyfits.open('any.lc.fits')
time = data[1].field(0)
rate = data[1].field(1)

Questo significa che nella prima unita' del file .fits (data[1]) e nella prima colonna (field(0)) si trovano i tempi, nella seconda colonna (field(1)) i conteggi (o rate).
Pensavo di sommare i primi 50 conteggi con qualcosa del genere:

count1 = [ sum(x) for x in data[1].field(1) ]

ma non so come limitare la somma ai soli primi 50 elementi...
Non sono molto pratico di python, dunque qualsiasi aiuto e' benvenuto.:rolleyes:

cdimauro
14-02-2013, 12:10
Dovresti iterare le 50 righe, quindi, verrebbe fuori qualcosa del genere:
Somma = sum(data[i].field(1) for i in xrange(1, 51))
In pratica generi i numeri da 1 a 50, e li usi per accedere all'apposita riga. Di questa poi estrai soltanto il secondo campo / colonna.

SoONicK
14-02-2013, 14:02
Grazie mille per la risposta!
Ho scelto di riscrivere il rate come:
rate = data[1].data.field('WEIGHTED_COUNTS')[:,0]

(L'ultima assegnazione [:,0] serve perche' quel campo in realta' e' un array (count rate in 4 diverse energy bands), e io voglio prendere la prima colonna di quell'array).
Se seguo l'esempio da te riportato:

Somma = sum(rate for i in xrange(1, 51))
print Somma

Ottengo un altro array come risultato:
[ 937700 908600 904850 ..., 1061950 1134800 1115700]

Gli elementi di questo array CREDO che siano le somme dei 50 elementi consecutivi nel field WEIGHTED_COUNTS (somma dei primi 50 elementi, somma dei successivi 50, etc.)

Ok, posso ottenere il valore che voglio prendendo Somma[1], ma non capisco il principio percui ottengo un altro array anziche' una singola somma. La somma non dovrebbe fermarsi ai primi 50 elementi e stop?

cdimauro
14-02-2013, 19:52
Francamente non capisco. L'oggetto rate sembrerebbe un iteratore, che ogni volta restituisce un elemento diverso, ma è veramente molto strano.

Non capisco perché viene fuori quel risultato.