嗨,我正在尝试从两个调查(PRIMUS和VIPERS)中提取RA,Dec和redshift信息,并将它们收集到单个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))
当我运行此命令时,出现“ IndexError:数组索引过多”
数据集:PRIMUS Redshift目录-https://primus.ucsd.edu/version1.htmlVIPERS Redshift目录-https://projects.ift.uam-csic.es/skies-universes/VIPERS/photometry/
我认为您可以通过多种方式来执行此操作,从而无法有效地使用现有的可用工具,从而使自己更难。例如,由于您正在使用FITS文件中的表格数据,因此可以利用Astropy的Table界面:
>>> from astropy.table import Table
>>> primus = Table.read('PRIMUS_2013_zcat_v1.fits')
(对于这个特定的文件,我收到一些有关表中某些标头为非标准的警告,但这可以忽略)。
如果只对表的几列执行某些操作,则可以轻松地执行此操作。例如,与其一起做,不如选择几列,然后将它们堆叠到一个新数组中]
np.column_stack((data_PRIMUS['RA'], data_PRIMUS['DEC'],
data_PRIMUS['Z'], data_PRIMUS['FIELD']))
您可以从表中选择列的子集,如下所示:
>>> primus[['RA', 'DEC', 'Z', 'FIELD']]
<Table length=213696>
RA DEC Z FIELD
degree degree
float64 float64 float32 bytes13
------------------ ------------------- ---------- -------------
52.892275339281994 -27.833172368069615 0.3420992 calib
52.88448889270391 -27.85252305560996 0.4824943 calib
52.880363885710295 -27.86221750021335 0.33976158 calib
52.88334306466262 -27.86937808271639 0.6134631 calib
52.8866138857103 -27.871773055662942 0.58744365 calib
52.885607068267845 -27.889578785511922 0.26873255 calib
... ... ... ...
34.54856 -4.5544 0.8544105 xmm
34.56942 -4.57564 0.6331108 xmm
34.567412432719756 -4.572718190305209 1.1456184 xmm
34.57134 -4.56414 0.6346616 xmm
34.58088 -4.56804 1.081143 xmm
34.58686 -4.57449 0.7471819 xmm
然后似乎您通过使用RA
函数选择了DEC
,Z
和xmm
列,其中字段为filter
,但是由于这些是Numpy数组,因此您可以使用内置的过滤功能numpy数组索引以及表索引。唯一棘手的部分是,由于这些是固定宽度的字符字段,因此您仍然需要正确执行比较。您可以使用Numpy的字符串函数,例如np.char.startswith
:
np.char.startswith
在进行性能比较的过程中,我意识到这一行可能是您出现错误>>> primus = primus[np.char.startswith(primus['FIELD'], b'xmm')]
的地方:
IndexError: too many indices for array
[在Python 3中,>>> np.array(filter(lambda x: x[3].strip() == 'xmm', primus))
array(<filter object at 0x7f5170981940>, dtype=object)
函数返回一个可迭代的,因此将其包装在filter
中只会使包含该Python对象的0-D数组;它可能不是您想要的,所以它在这里失败了(这在查看回溯可能很有用)。即使将np.array()
调用包装在filter()
中,它也不会起作用,因为list()
通常只接受同构数组。因此,与我给出的方法完全一样(尽管可能会有一些更有效的方法)。它还使下一行:
np.array()
不必要。特别是前三列已经采用浮点格式,因此无论如何都不需要这样做。
一些类似的建议也适用于代码的其他部分。我会像这样写它:
np.array(map(lambda x: [float(x[0]), float(x[1]), float(x[2])], data_PRIMUS))
请让我知道您是否对此有任何疑问。