我拥有一个适合格式的表格。我在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
并且,如何在新的打印阵列中添加一个或两个以上的条件?
谢谢!
答案 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数组是更多的表,真正的表程序如pandas
或astropy.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回答表格。