如何从fit表python中进行排序

时间:2016-03-02 16:07:47

标签: python numpy astropy

我拥有一个适合格式的表格。我在Python中使用astropy.io.fits库。 我正在阅读文件,我想用条件打印我的数组。

例如,我想要打印列" CHI"的所有行。 >值

#!/usr/bin/python
# coding: utf-8

from astropy.io import fits
import numpy as np

        ##################################
        # Fichier contenant le champ 169 #
        ##################################

file = '/astromaster/home/xxxx/Bureau/Stage/Champs/Field_169/Field169_combined_final_roughcal.fits'

field169 = fits.open(file)          # Ouverture du fichier à l'aide d'astropy

tbdata = field169[1].data           # Lecture des données fits

#print tbdata['CHI']
#print tbdata[tbdata['CHI'] < 1.0]

for row in tbdata :
    if tbdata['CHI'] < 1.0 :
        print row

并且,如何在新的打印阵列中添加一个或两个以上的条件?

谢谢!

2 个答案:

答案 0 :(得分:2)

Astropy的界面功能最适合处理图像数据,而不是表格。

Astropy tables库对您有所帮助。使用t = astropy.table.Table.read(fname)(旁边:file在Python中保留,因此您应该避免将其用作变量名)将允许您将FITS表作为Astropy表读取,其工作方式很像numpy记录数组。

然后你可以根据列值进行过滤,例如:print t[t['CHI'] < 1.](如果你不熟悉numpy,你可能会对掩蔽和元素选择做更多的阅读,因为这与numpy& #39;的功能 - 如果您不熟悉,我会考虑阅读上述声明&#34; t,使t['CHI']小于1。&#34;)

您也可以组合条件:print t[(t['A'] < 1) & (t['B'] > 2)]。当你完成后,你可以使用t.write(fname2)

写出来

答案 1 :(得分:2)

首先,这与您的问题无关:如果您打开任何文件,您应该在之后再次关闭它或将其用作上下文管理器。我通常更喜欢上下文管理器:

filename = '...'
with fits.open(filename) as field169:
    tbdata = field169[1].data
... continue without indentation after you have finished with the file.

之后你有一个记录numpy数组,你可以使用它,但由于结构化的numpy数组是更多的表,真正的表程序如pandasastropy.table可能非常方便。

但是如果你真的想把自己限制在桌面上,你会得到from fits.open(你不应该因为重组和结构化数组的行为与普通的表操作有点不同),你可以使用给定的在documentation

mask = tbdata['CHI'] < 1.0
tbdata[mask]

或者如果您想要有多个条件,只需添加&(如果两者都适用)或|(如果至少应满足其中一个条件):

mask = tbdata['CHI'] < 1.0 & tbdata['CHI'] > 0.5
tbdata[mask]

mask = tbdata['CHI'] < 1.0 | tbdata['OTHER'] > 0.5
tbdata[mask]

我希望这会对你有所帮助。但是你可能最好使用@DathosPachy回答表格。