What is fitsio Python?

Citirea fișierelor FITS în Python: Ghid Complet

04/04/2026

Rating: 4.78 (6054 votes)

Dacă ești pasionat de astronomie, astrofizică sau pur și simplu lucrezi cu date științifice, ai auzit, fără îndoială, de fișierele FITS (Flexible Image Transport System). Acestea reprezintă standardul de aur pentru stocarea imaginilor și tabelelor în comunitatea astronomică, fiind concepute pentru a asigura portabilitatea și integritatea datelor pe termen lung. Dar cum le citim eficient, mai ales pe cele de dimensiuni considerabile, folosind puterea Python?

Acest ghid detaliază metodele principale de manipulare a fișierelor FITS în Python, concentrându-se pe două biblioteci esențiale: astropy.io.fits (fostul PyFITS) și fitsio. Vom explora nu doar cum să deschizi și să citești date, ci și cum să gestionezi fișierele mari, să accesezi metadatele (headerele) și să lucrezi cu diferite tipuri de date, precum imagini și tabele.

How do I read FITS files in Python?
SDSS provides a forked version of the library in our GitHub organization. idlutils also contains additional programs for manipulating FITS files. The astropy.io.fits package handles the reading and writing of FITS files in Python. Because of the general usefulness of the astropy package, this is the recommended Python reader for most FITS files.
Cuprins

Ce sunt fișierele FITS și de ce sunt importante?

Fișierele FITS sunt un format de fișier digital utilizat pe scară largă în astronomie pentru stocarea, transmiterea și arhivarea datelor științifice. Un fișier FITS este structurat în unități numite HDU (Header Data Unit), fiecare constând dintr-un antet (header) și, opțional, un bloc de date. Antetul conține metadate esențiale despre datele asociate, cum ar fi dimensiunile imaginii, unitățile, timpul de expunere și multe altele. Această structură modulară și autodescriptivă face ca FITS să fie extrem de robust și adaptabil pentru o varietate de tipuri de date astronomice, de la imagini la spectre și tabele.

Importanța lor rezidă în standardizarea modului în care datele astronomice sunt gestionate global, permițând cercetătorilor din întreaga lume să partajeze și să analizeze date fără probleme de compatibilitate. Python, cu ecosistemul său bogat de biblioteci științifice, devine un instrument indispensabil pentru interacțiunea cu aceste fișiere.

Lucrul cu astropy.io.fits (PyFITS)

astropy.io.fits este o componentă cheie a pachetului Astropy, o bibliotecă fundamentală pentru astronomie în Python. Aceasta oferă o interfață comprehensivă și flexibilă pentru citirea și scrierea fișierelor FITS. Inițial, a fost cunoscută sub numele de PyFITS, dar a fost ulterior integrată în Astropy, devenind modulul standard recomandat.

Instalare

Pentru a utiliza astropy.io.fits, trebuie să ai instalat pachetul Astropy. Acest lucru se poate face simplu, folosind pip:

pip install astropy

Reține că Astropy are nevoie și de pachetul NumPy, care de obicei este instalat automat ca dependență. NumPy este esențial pentru manipularea eficientă a datelor numerice, cum ar fi matricile de pixeli sau tabelele.

Deschiderea unui fișier FITS

Deschiderea unui fișier FITS este primul pas. Funcția fits.open() returnează un obiect HDUList, care este o colecție de obiecte HDU (Header Data Unit). Fiecare HDU conține un antet și, de obicei, un set de date (imagine sau tabel).

from astropy.io import fits hdulist = fits.open('nume_fisier.fits')

Modul implicit de deschidere este "readonly". Obiectul HDUList se comportă ca o listă, permițându-ți să accesezi HDU-urile individuale folosind indexarea bazată pe zero (hdulist[0] pentru HDU-ul primar, hdulist[1] pentru prima extensie etc.).

Inspectarea conținutului fișierului

O metodă foarte utilă a obiectului HDUList este info(), care oferă un rezumat concis al conținutului fișierului FITS, inclusiv numele extensiilor, tipurile de HDU, dimensiunile și formatele datelor.

hdulist.info() # Exemplu de output: # Filename: test1.fits # No. Name Type Cards Dimensions Format # 0 PRIMARY PrimaryHDU 220 () int16 # 1 SCI ImageHDU 61 (800, 800) float32 # 2 SCI ImageHDU 61 (800, 800) float32 # ...

Închiderea fișierului

După ce ai terminat de lucrat cu fișierul, este o bună practică să îl închizi explicit folosind metoda close(). Antetele (headerele) vor rămâne accesibile, dar datele pot sau nu să fie accesibile în funcție de modul în care au fost încărcate (de exemplu, dacă s-a folosit memmap).

hdulist.close()

Lucrul cu fișiere FITS mari: Opțiunea memmap

Unul dintre cele mai mari avantaje ale astropy.io.fits pentru fișierele mari este argumentul memmap=True. Acesta permite accesarea datelor direct din fișier (memory-mapped), fără a încărca întregul conținut în memoria RAM. Acest lucru este crucial pentru fișierele care depășesc capacitatea memoriei fizice, cum ar fi fișierul spAll menționat în contextul datelor SDSS.

from astropy.io import fits fx = fits.open('spAll-v5_10_0.fits', memmap=True) d = fx[1].data # Accesează datele celei de-a doua HDU

Pe sistemele pe 64 de biți cu memorie suficientă (> 4 GB), memmap este o soluție excelentă. Începând cu PyFITS v3.1.0 (și implicit în Astropy), memmap=True este valoarea implicită. Este important de reținut că, deși hdul.close() închide lista de HDU-uri, maparea memoriei poate menține încă un handle deschis către fișier. Pentru a forța închiderea, poți șterge manual referința la date: del hdul[0].data sau să lași obiectul HDUList să iasă din scop.

What is PyFITS in Python?
FITS (Flexible Image Transport System) is a portable file standard widely used in the astronomy community to store images and tables. PyFITS requires Python version 2.6 or newer. Support for Python 3.0 through 3.2 is deprecated, but Python 3.3 and above are fully supported. PyFITS also requires the numpy package.

Integers fără semn (Unsigned Integers)

Datorită originilor FITS în FORTRAN, formatul nu suportă nativ numere întregi fără semn. Cu toate acestea, există o convenție comună de a stoca numere întregi fără semn ca numere întregi cu semn, împreună cu o instrucțiune de deplasare (un cuvânt cheie BZERO cu valoarea 2 ** (BITPIX - 1)). astropy.io.fits recunoaște și aplică automat această convenție, convertind datele în numere întregi fără semn atunci când este necesar (începând cu v3.4.0, acest lucru este implicit).

Fișiere compresate

astropy.io.fits poate deschide fără probleme fișiere FITS care au fost compresate cu utilitare externe precum gzip (.gz), bzip2 (.bz2) sau pkzip. Există totuși unele limitări; de exemplu, în cazul fișierelor Zip care conțin mai multe fișiere compresate, doar primul fișier va fi accesibil. De asemenea, bzip nu suportă modurile de acces pentru adăugare sau actualizare.

Lucrul cu antetele (Headers) FITS

Antetele FITS sunt colecții de "carduri" de 80 de octeți, fiecare conținând un cuvânt cheie, o valoare și un comentariu. Atributul .header al unui obiect HDU este o instanță a clasei Header, un alt obiect PyFITS (acum Astropy). Poți accesa valorile cuvintelor cheie ca într-un dicționar Python:

prihdr = hdulist[0].header print(prihdr['TARGNAME']) # Acces prin nume (case-insensitive) print(prihdr[27]) # Acces prin index (0-based)

De asemenea, poți actualiza valorile sau adăuga noi carduri:

prihdr['TARGNAME'] = 'NGC121-a' prihdr['OBSERVER'] = ('Edwin Hubble', 'Numele observatorului') prihdr.set('DATE-OBS', '2023-10-27', 'Data observației')

Pentru a vizualiza întregul antet, poți folosi print(repr(prihdr)) sau pur și simplu introduce obiectul header în consolă. Pentru a obține o listă a tuturor cuvintelor cheie, folosește prihdr.keys().

Lucrul cu date de tip imagine

Dacă un HDU conține o imagine, atributul .data al obiectului HDU va returna un obiect numpy.ndarray. Acesta este un array multidimensional, pe care îl poți manipula folosind toate funcționalitățile NumPy. Reține că indexarea este bazată pe zero, iar axele sunt ordonate de la cea mai lentă la cea mai rapidă (similar cu C, nu cu FORTRAN).

scidata = hdulist[1].data # Accesează datele din a doua HDU (prima extensie) print(scidata.shape) # Ex: (800, 800) print(scidata.dtype.name) # Ex: 'float32' # Acces la un pixel print(scidata[1, 4]) # Slicing sub_section = scidata[30:40, 10:20] # Actualizarea valorilor scidata[1, 4] = 999 scidata[30:40, 10:20] = 999 # Operații matematice (ex: conversie flux) photflam = hdulist[1].header['PHOTFLAM'] exptime = prihdr['EXPTIME'] scidata *= photflam / exptime

Această flexibilitate oferită de NumPy este un motiv major pentru care astropy.io.fits este atât de puternic.

Lucrul cu date de tip tabel

Datele de tip tabel dintr-un fișier FITS sunt accesibile tot prin atributul .data și se comportă similar cu un numpy.recarray (record array). Fiecare rând al tabelului este un obiect FITS_record, care se comportă ca un tuplu Python.

hdulist = fits.open('tabel.fits') tbdata = hdulist[1].data # Presupunând că prima extensie este un tabel # Acces la primul rând print(tbdata[0]) # Acces la o coloană prin index sau nume print(tbdata.field(0)) print(tbdata.field('ID')) print(tbdata['ID']) # Metoda preferată, ca un dicționar

Pentru a inspecta definițiile coloanelor (nume, formate, unități), poți folosi atributul .columns, care este un obiect ColDefs, și metoda info() a acestuia:

cols = hdulist[1].columns cols.info() print(cols.names) # Listează numele coloanelor

Similar cu imaginile, poți actualiza valorile, calcula medii sau efectua alte operații folosind funcționalitățile NumPy:

tbdata['FLAG'][:] = 0 mean_mag = tbdata['MAG'].mean()

Lucrul cu fitsio

fitsio este o altă bibliotecă Python robustă pentru citirea și scrierea fișierelor FITS. Este scrisă în C și Python și utilizează intern CFITSIO, o bibliotecă C de înaltă performanță pentru FITS. Acest lucru îi conferă un avantaj semnificativ în ceea ce privește viteza, în special pentru fișierele foarte mari sau atunci când este necesară citirea selectivă a datelor.

Instalare

Instalarea fitsio este, de asemenea, simplă:

pip install fitsio

Pachetul include o versiune de CFITSIO, deci nu este necesară o instalare separată a acesteia.

Citirea fișierelor FITS mari cu fitsio

Avantajul major al fitsio pentru fișierele mari, cum ar fi fișierul spAll, este capacitatea de a citi doar coloanele selectate, fără a încărca întregul fișier în memorie. Acest lucru reduce semnificativ cerințele de memorie și timpul de procesare.

import fitsio columns = ['PLATE', 'MJD', 'FIBERID', 'Z', 'ZWARNING', 'Z_ERR'] d = fitsio.read('spAll-v5_10_0.fits', columns=columns)

Această abordare este mult mai eficientă decât citirea întregului fișier, mai ales când ai nevoie doar de un subset specific de date dintr-un tabel masiv.

How do I read FITS files in Python?
SDSS provides a forked version of the library in our GitHub organization. idlutils also contains additional programs for manipulating FITS files. The astropy.io.fits package handles the reading and writing of FITS files in Python. Because of the general usefulness of the astropy package, this is the recommended Python reader for most FITS files.

Comparație: astropy.io.fits vs. fitsio

Ambele biblioteci sunt excelente pentru lucrul cu fișiere FITS în Python, dar au puncte forte diferite. Alegerea depinde adesea de cerințele specifice ale proiectului tău.

Caracteristicăastropy.io.fitsfitsio
IntegrareParte a ecosistemului Astropy, bine integrată cu alte funcționalități astronomice.Bibliotecă independentă, focalizată pe I/O.
PerformanțăBun pentru majoritatea cazurilor; opțiunea memmap ajută la fișiere mari. Poate necesita încărcarea întregului fișier în memorie pentru anumite operații.Extrem de rapid, în special pentru fișiere mari, datorită implementării în C și a utilizării CFITSIO. Excelentă pentru citirea selectivă a coloanelor.
Ușurință în utilizareAPI complet și intuitiv, cu funcționalități extinse pentru manipularea antetelor și datelor.API mai simplu și mai direct pentru operații de citire/scriere de bază și citirea selectivă.
Suport pentru funcționalități FITS avansateSuportă o gamă largă de convenții FITS (ex: unsigned integers, compresie internă).Suportă de asemenea funcționalități avansate, inclusiv imagini compresate (tile-compressed).
DependențeNecesită NumPy.Necesită NumPy, include CFITSIO.
Scenariu idealAnaliză complexă de date, manipularea detaliată a antetelor, integrare cu alte module Astropy.Citirea rapidă a subseturilor de date din fișiere foarte mari, aplicații cu cerințe stricte de performanță.

Pentru majoritatea utilizatorilor și a sarcinilor de analiză generală, astropy.io.fits este o alegere excelentă și versatilă. Dacă te confrunți însă cu fișiere FITS extrem de mari și ai nevoie de o viteză maximă de citire sau de capacitatea de a citi doar anumite coloane, fitsio devine o alternativă valoroasă.

Întrebări Frecvente (FAQ)

Ce sunt fișierele FITS?

Fișierele FITS (Flexible Image Transport System) sunt un format standard deschis, utilizat pe scară largă în astronomie pentru stocarea, transmiterea și arhivarea datelor științifice. Ele pot conține imagini, tabele, spectre și alte tipuri de date, împreună cu metadate extinse în antete.

De ce să folosesc Python pentru a citi fișiere FITS?

Python este un limbaj popular în comunitatea științifică datorită sintaxei sale clare, ecosistemului bogat de biblioteci (cum ar fi NumPy, SciPy, Matplotlib și Astropy) și capacității sale de a gestiona eficient datele. Bibliotecile specializate pentru FITS, cum ar fi astropy.io.fits și fitsio, fac procesul de citire și manipulare a datelor FITS simplu și eficient.

Ce este PyFITS și cum se leagă de astropy.io.fits?

PyFITS a fost o bibliotecă Python independentă pentru lucrul cu fișiere FITS. Ulterior, a fost integrată în pachetul Astropy și acum este disponibilă ca astropy.io.fits. Deci, când auzi de PyFITS, se face referire la aceeași funcționalitate de bază, acum parte a Astropy.

Cum pot gestiona fișierele FITS foarte mari care nu încap în memorie?

Pentru fișierele FITS mari, poți folosi opțiunea memmap=True atunci când deschizi fișierul cu astropy.io.fits. Aceasta permite accesul la date prin maparea memoriei, fără a încărca întregul fișier în RAM. Alternativ, fitsio este o alegere excelentă, deoarece îți permite să citești doar coloanele sau secțiunile de date de care ai nevoie, reducând semnificativ amprenta de memorie.

Pot citi fișiere FITS compresate?

Da, atât astropy.io.fits, cât și fitsio pot citi fișiere FITS care au fost compresate cu utilitare standard precum gzip (.gz) sau bzip2 (.bz2). fitsio are, de asemenea, suport robust pentru imagini compresate intern (tile-compressed) folosind CFITSIO.

Pot modifica și salva fișiere FITS cu aceste biblioteci?

Da, ambele biblioteci oferă funcționalități pentru modificarea antetelor și datelor, precum și pentru scrierea (sau suprascrierea) fișierelor FITS. Acest articol s-a concentrat pe citire, dar operațiunile de scriere sunt la fel de bine suportate.

Concluzie

Citirea și manipularea fișierelor FITS în Python este o sarcină fundamentală pentru oricine lucrează cu date astronomice. Cu biblioteci puternice precum astropy.io.fits și fitsio, Python oferă instrumente flexibile și performante pentru a interacționa cu aceste formate de fișiere, indiferent de dimensiunea sau complexitatea datelor. Fie că ești un cercetător experimentat sau un entuziast, stăpânirea acestor tehnici îți va deschide noi orizonturi în explorarea universului de date.

Dacă vrei să descoperi și alte articole similare cu Citirea fișierelor FITS în Python: Ghid Complet, poți vizita categoria Fitness.

Go up