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', format='csv', names=header, overwrite=True)我正在尝试使用星表查询功能将我计算机上的CSV文件中的172个星系与astroquery.mast模块中的星系进行匹配。
对astroquery.mast感兴趣的目录是GALEX (银河进化探索者)。本质上,我希望代码循环遍历我的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文件经验的人都会有所帮助。
我正在使用Python3.6和解释器astroconda3运行这段代码
下面是代码的图片:172_RQEs_GALEX_mast_match.py
发布于 2021-07-13 18:43:48
我想我知道你的错误在哪里了。在构造galexMatchCatalog时,您将创建一个行数据列表,其中包含来自catalogData的第一行,以及您想要作为附加列附加到该行的两个坐标[RAgal, RAdec]。
然后向ascii.write传递一个按行排列的数据列表列表。
实际上,这有点违反直觉,但如果您向ascii.write传递一个列表,它会假设它是一个列的列表,而不是行的列表,所以它会爆炸,因为行数与列数不匹配。也许这里的错误消息会更有用。
例如,您可以看到ascii.write文档中的第一个Example显示它传递了一个列的列表(这是为了提高效率,因为通常为了面向列的操作而按列存储数据更有效)。
事实上,如果你传递给ascii.write的不是一个星形的Table,它会尝试从第一个参数开始构造一个Table (你可以在table = Table(table, names=names)行的回溯中看到这一点)。
同样,当使用Constructing a Table时,它将列表解释为列的列表。要向它传递一个行列表,您可以这样做:
>>> table = Table(rows=galexMatchCatalog, names=header)
>>> table.write(filename, format='ascii.csv')不过,更一般的情况是,我可以这样做(尽管有很多方法)。
使用从CSV文件读取的sample,您已经拥有了一个包含RAgal和DECgal列的astropy Table对象。您可以创建一个仅包含这些列的子表,如下所示:
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')https://stackoverflow.com/questions/68350613
复制相似问题