2016-04-02 16 views
0

Sorunum için bir çözüm bulmaya çalıştım, ancak yapamadım. Bir FITS veri küpüm var ve bunu PyFITS ile kesmem gerekiyor. Komutumla yaptığımda, sonunda 2 boyutlu bir FITS resmim olacak! Birinci boyut enerjidir, ikinci ve üçte ikisi sırasıyla boylam ve enlemdir.Crop FITS verileri PyFITS aracılığıyla küp görüntüsü

Benim komut aşağıdaki gibidir:

#!/usr/bin/env python 
import pyfits 
import os 
import sys 


def CropFitsFile(src, dst, xs, xe, ys, ye): 
    fh = pyfits.open(src) 
    for eng in range(0,2): 
     img = fh[0].data[eng,ys:ye,xs:xe] 
     header = fh[0].header 
     newfh=pyfits.PrimaryHDU(data=img,header=header) 
     if os.path.exists(dst): 
      os.remove(dst) 
     newfh.writeto(dst) 


if __name__ == "__main__": 
    CropFitsFile(
     src=sys.argv[1], 
     dst=sys.argv[2], 
     xs=int(sys.argv[3]), 
     xe=int(sys.argv[4]), 
     ys=int(sys.argv[5]), 
     ye=int(sys.argv[6]) 
     ) 
+0

? Bu iyi görünüyor, az ya da çok. Birkaç küçük nota, "pyfits" 'in kullanımdan kaldırıldığını ve bunun yerine "astropy.io.fits" yi kullanmanız gerektiğini (içe aktarma dışında herhangi bir kod değişikliği gerektirmeyecektir). Ve 'wrtieto' yöntemi zaten varolan bir dosyanın üzerine yazmak için yerleşik işlevlere sahiptir (' clobber' seçeneği). Bunun için fazladan kod gerekmez. Ama yine de bir sorunuz mu var? – Iguananaut

+0

Merhaba Iguananaut, Cevabınız için teşekkür ederiz. Sorun şu ki, 3 boyutlu bir veri küpünü kırpmam gerekiyor, ancak kodu çalıştırdığımda, sonuçlar 2 boyutlu bir görüntüdür! Bunu nasıl düzeltebilirim bilmiyorum. Pyropları astropy.io.fits ile değiştirdim, ama yine de aynı problem. Yardımınız için tekrar teşekkür ederiz. –

+0

Yani hala 3 boyutta olmasını istiyorsunuz, ancak 1 boyutunun ilk boyutu var mı? – Iguananaut

cevap

0

doğru anlamak bir 3D dizi dilim ama (sadece boyut 1 bile) üçüncü boyutlarını tutmak istiyorsanız.

Bu, Numpy dizileri hakkında bir sorudur. Bir N boyutlu numpy diziniz olduğunda, bir boyut için bir skaler indeksi geçirdiğinizde, indekslediğiniz eksen boyunca dilimlenmiş bir dizi N-1 döndürür. Örneğin: sebebi ne olursa olsun,

>>> arr[:,0,:] 
array([[ 0, 1, 2], 
     [ 9, 10, 11], 
     [18, 19, 20]]) 

İsterseniz bir N-1 boyutlu dizinin yerine N boyutlu bir dizi dönmek:

>>> arr = np.arange(27).reshape(3, 3, 3) 
>>> arr 
array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

     [[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]], 

     [[18, 19, 20], 
     [21, 22, 23], 
     [24, 25, 26]]]) 
>>> arr[0] 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
>>> arr[1] 
array([[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]) 

Ayrıca gibi farklı bir eksen boyunca dilim En kolay yol, skaler endeks kullanmak yerine 1 numaralı bir dilim dilimini istemektir. Örneğin:

>>> arr[0:1] 
array([[[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]]) 

Ben bu gibi diğer sorular verdiğim aynı tavsiyeyi vereceğiz: Bu gerçekten veri bir dosya FITS çıktı gerçeği ötesinde PyFITS hakkında bir soru değil. PyFITS, çoğu bilimsel Python kütüphanesi gibi, verileri numpy dizileri olarak döndürür. Bunlar çoğu bilimsel Python uygulamasında sayısal veriler için kullanılan ana veri yapısıdır, bu yüzden bazı temel bilgileri öğrenmek, Python'da veri analizi yapmak için daha iyi veya daha kötü bir önkoşulun önkoşuludur. Eğer MATLAB kullandıysanız, NumPy dizileri MATLAB'deki dizilere benzer. Sen benim kısa öğretici ile başlayabilir, ancak diğerleri (ve çok muhtemelen daha iyi olanlar :) github.com/embray/notebooks/blob/master/numpy.ipynb vardır tam olarak sorunun ne

+0

Detaylı ve yararlı cevabınız için çok teşekkür ederim. Bu bağlantı bana cevabı bulmak için çok yardımcı oldu :) evet FITS dosyasının manupulating başlığı hakkında daha fazla bilgiye ihtiyacım vardı. Np.resize gibi 2 boyutlu veya 3 boyutlu FITS dosyalarını yeniden boyutlandırmanın birçok yolu var gibi görünüyor. Kodu aşağıdaki gibi değiştirdim ve işe yaradı;) –

+0

Başlığa baktığımızda, resim boyutlarıyla ilgili üstbilgi anahtar kelimelerini el ile düzenlemenin gerekli olmadığı tavsiyesine uyun. Bu cevap sorununuzu çözdüyse lütfen çözümü kabul edin. – Iguananaut

-1
from astropy.io import fits 

Ccube = fits.open('Cha_binned_ccube.fits', mode='update') 
Ccube.info() 
Ccube[0].shape 
Ccube[0].data = Ccube[0].data[0:3,0:181,0:402] 
Ccube[0].writeto('Cha_binned_ccube_resize.fits') 
+1

Bu kod soruya cevap verebilirken, sağlamasının _why_ ve/veya _how_ ile ilgili ek bağlamında yanıtı bu soru uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen bazı açıklama eklemek için cevabınızı [düzenleyin]. –