嗨,我正试图从两次调查(PRIMUS和VIPERS)中提取RA、Dec和红移信息,并将它们收集到一个nd阵列中。 代码如下:
from astropy.io import fits
import numpy as np
hdulist_PRIMUS = fits.open('data/PRIMUS_2013_zcat_v1.fits')
data_PRIMUS = hdulist_PRIMUS[1].data
data_PRIMUS = np.column_stack((data_PRIMUS['RA'], data_PRIMUS['DEC'],
data_PRIMUS['Z'], data_PRIMUS['FIELD']))
data_PRIMUS = np.array(filter(lambda x: x[3].strip() == 'xmm', data_PRIMUS))[:, :3]
data_PRIMUS = np.array(map(lambda x: [float(x[0]), float(x[1]), float(x[2])], data_PRIMUS))
hdulist_VIPERS = fits.open('data/VIPERS_W1_SPECTRO_PDR2.fits')
data_VIPERS = hdulist_VIPERS[1].data
data_VIPERS = np.column_stack((data_VIPERS['alpha'], data_VIPERS['delta'], data_VIPERS['zspec']))
from astropy import units as u
from astropy.coordinates import SkyCoord
PRIMUS_catalog = SkyCoord(ra=data_PRIMUS[:, 0]*u.degree, dec =data_PRIMUS[:, 1]*u.degree)
VIPERS_catalog = SkyCoord(ra=data_VIPERS[:, 0]*u.degree, dec=data_VIPERS [:, 1]*u.degree)
idx, d2d, d3d = PRIMUS_catalog.match_to_catalog_sky(VIPERS_catalog)
feasible_indices = np.array(map(
lambda x: x[0],
filter(lambda x: x[1].value > 1e-3, zip(idx, d2d))))
data_VIPERS = data_VIPERS[feasible_indices]
data_HZ = np.vstack((data_PRIMUS, data_VIPERS))
当我运行这个时,我得到一个“索引器:数组的索引太多”
数据集: PRIMUS红移目录-https://primus.ucsd.edu/version1.html 蝰蛇红移目录-https://projects.ift.uam-csic.es/skies-universes/VIPERS/photometry/
我认为有几种方法可以让你不使用现有的、可用的工具,从而让你自己更难做到这一点。例如,由于您正在使用FITS文件中的表格数据,因此可以利用Astropy的Table接口:
(对于这个特定的文件,我得到了一些警告,说明表中的某些头是非标准的,但这可以忽略)
如果只想对表中的几列执行某些操作,可以很容易地执行。例如,选择几列,然后将它们堆叠到一个新数组中,而不是执行您所做的操作
您可以从表中选择列的子集,如下所示:
然后,您似乎通过使用} 来实现以下目的:
filter
函数来选择字段为xmm
的RA
、DEC
和Z
列,但由于这些是Numpy数组,您可以使用Numpy数组索引中内置的过滤功能以及表索引。唯一棘手的是,由于这些字段是固定宽度的字符字段,因此仍然需要正确执行比较。您可以使用Numpy的字符串函数^{在进行性能比较的过程中,我意识到这一行可能会出现错误
IndexError: too many indices for array
:在Python3中,
filter
函数返回一个iterable,因此将其包装在np.array()
中只会生成一个包含此Python对象的0-D数组;这可能不是您想要的,因此在这里失败了(在这里查看回溯可能会很有用)。即使将filter()
调用包装到list()
中,它也不会工作,因为np.array()
通常只接受同构数组。因此,像我给出的方法完全足够(尽管可能有稍微更有效的方法)。它还包括下一行:不必要。特别是,前三列已经是浮点格式,因此无论如何这都不是必需的
一些类似的建议也适用于代码的其他部分。我会写得更像这样:
请让我知道,如果你有任何问题的这一部分
相关问题 更多 >
编程相关推荐