问题描述
from astroquery.mast import Catalogs
import numpy as np
from astropy.io import ascii
myfile='/Users/slaterjonesoden/Desktop/galEX_analysis/RQE_sample_data.csv'
sample = ascii.read(myfile,format='csv',delimiter=',',guess=True)
galexMatchCatalog=[]
iteration = 1
for each_galaxy in sample:
catalogData = Catalogs.query_object(str(each_galaxy['RAgal'])+str(' ')+str(each_galaxy['DECgal']),catalog="galex")
print(iteration)
iteration += 1
if iteration > 2:
break
if len(catalogData)!=0:
sdss_info = [each_galaxy['RAgal'],each_galaxy['DECgal']]
galexMatchCatalog.append(list(np.array(catalogData)[0])+sdss_info)
header = catalogData.colnames + ['sdss_ra','sdss_dec']
ascii.write(galexMatchCatalog,'/Users/slaterjonesoden/Desktop/galEX_analysis_codes/172_RQEs_galex_mast_match.csv',names=header,overwrite=True)
我正在尝试使用目录查询功能使此代码将当前在我计算机上的 CSV 文件中的 172 个星系与 astroquery.mast 模块中的星系相匹配。
astroquery.mast 中感兴趣的目录是 galEX(galaxy Evolution Explorer)。本质上,我希望代码遍历 CSV 文件中的 172 个星系,并将它们(使用 RA 和 DEC)与 astroqury.mast 中的 galEX 目录中的星系进行匹配。
匹配这些星系后,我想用来自这些星系的 galEX 数据编写一个新的 CSV 文件。
我的第一个尝试是定义一个 writeCsvFile() 函数,但这无法正常写入 csv 文件。
我的下一个尝试是从 astropy.io 导入 ascii 并使用 ascii.read() 和 ascii.write() 函数来读取和写入这些 CSV 文件。起初我以为我很幸运,因为 for 循环正在工作,但是在经过 for 循环之后 ascii.write() 函数无法正常工作。下面是我运行代码时得到的错误信息:
error message I get when running the code ascii version of the code
上图中的重要错误行: ValueError:参数“names”和“dtype”必须匹配列数
任何有使用 astroquery.mast 和读/写 CSV 文件经验的人都会有所帮助。
我使用 Python 3.6 和解释器 astroconda3 运行此代码
这是代码的图片: 172_RQEs_GALEX_mast_match.py
解决方法
我想我明白你的错误是什么。当您构造 galexMatchCatalog
时,您正在创建一个行数据列表,其中包含来自 catalogData
的第一行以及您想要作为附加列附加到该行的两个坐标 [RAgal,RAdec]
。
然后您传递 ascii.write
一个行列数据列表。
实际上这有点违反直觉,但是如果您传递 ascii.write
一个列表,它会假定它是一个 列 而非 行 的列表,因此当然,它会爆炸,因为行数与列数不匹配。也许这里的错误信息可能更有用。
例如,您可以看到 ascii.write
文档中的第一个 Example 显示它传递了一个列列表(这是为了提高效率,因为它通常更有效地存储数据列-为了面向列的操作而明智)。
事实上,如果你传递 ascii.write
不是 astropy Table
的东西,它会尝试从第一个参数构造一个 Table
(你可以在行的回溯中看到这一点上面写着table = Table(table,names=names)
。
同样,当 Constructing a Table 将列表解释为列列表。要将行列表传递给它,您可以执行以下操作:
>>> table = Table(rows=galexMatchCatalog,names=header)
>>> table.write(filename,format='ascii.csv')
更一般地说,我可能会这样做(尽管有很多方法)。
通过从 CSV 文件中读取的 sample
,您已经拥有一个包含 Table
和 RAgal
列的 astropy DECgal
对象。您可以制作一个只包含这些列的子表,例如:
coords = sample[['RAgal','DECgal']]
如果需要,您还可以根据最终输出中的内容重命名列:
coords.rename_columns(['RAgal','DECgal'],['sdss_ra','sdss_dec'])
现在您要遍历所有坐标对并查询目录,并根据查询结果构建一个行列表,包括用于查找它们的坐标。同样,有很多方法可以做到这一点,其中一些方法比其他方法更有效,但一种方法是使用 hstack
和 vstack
:
from astropy.table import hstack,vstack
galex_match_catalog = []
for galaxy_coords in coords:
catalog_data = Catalogs.query_object(f'{galaxy_coords["sdss_ra"]} {galaxy_coords["sdss_dec"]}',catalog='Galex')
if catalog_data:
galex_match_catalog.append(hstack([catalog_data[0],galaxy_coords]))
# Finally,write:
galaxy_match_catalog = vstack(galaxy_match_catalog)
galaxy_match_catalog.write(filename,format='ascii.csv')