0
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)

我正在尝试使用 Catalogs 查询功能让此代码将我计算机上当前 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() 函数无法正常工作。以下是我在运行代码时收到的错误消息:

运行代码 ascii 版本的代码时收到的错误消息

上图中的重要错误行:ValueError: Arguments "names" and "dtype" must match number of columns

任何有使用 astroquery.mast 和读/写 CSV 文件经验的人都会有所帮助。

我正在使用 Python 3.6 和解释器 astroconda3 运行此代码

这是代码的图片: 172_RQEs_GALEX_mast_match.py

4

1 回答 1

0

我想我明白你的错误是什么。当您构建时,galexMatchCatalog您正在创建一个行数据列表,其中包含第一行以及您希望作为附加列附加到该行catalogData的两个坐标。[RAgal, RAdec]

然后你传递ascii.write一个按行数据列表的列表。

实际上这有点违反直觉,但是如果您传递ascii.write一个列表,它会假定它是一个列列表而不是rows 因此它会爆炸,因为行数与列数不匹配,当然。也许错误消息在这里可能更有用。

例如,您可以看到文档中的第一个示例ascii.write显示它传递了一个列列表(这是为了提高效率,因为通常为了面向列的操作而按列存储数据更有效)。

事实上,如果你传递ascii.write的不是 astropy Table,它会尝试Table从第一个参数构造 a (你可以在回溯中看到table = Table(table, names=names).

同样,在构造表时,它将列表解释为列列表。要将行列表传递给它,您可以执行以下操作:

>>> table = Table(rows=galexMatchCatalog, names=header)
>>> table.write(filename, format='ascii.csv')

更一般地说,尽管这就是我可以做到的方式(尽管有很多方法)。

随着sample您从 CSV 文件中读取,您已经有了一个包含和列的 astropyTable对象。您可以创建一个仅包含以下列的子表:RAgalDECgal

coords = sample[['RAgal', 'DECgal']]

如果需要,您还可以根据最终输出中的需要重命名列:

coords.rename_columns(['RAgal', 'DECgal'], ['sdss_ra', 'sdss_dec'])

现在您想要遍历所有坐标对并查询目录,并根据查询结果构建行列表,包括您用于查找它们的坐标。同样,有很多方法可以比其他方法更有效,但一种方法是使用hstackand 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')
于 2021-07-13T10:43:47.767 回答