Python &引用;索引器:数组的索引太多;在融合毒蛇和报春的时候

Python &引用;索引器:数组的索引太多;在融合毒蛇和报春的时候,python,numpy,astropy,fits,Python,Numpy,Astropy,Fits,嗨,我正试图从两次调查(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_PRIMU

嗨,我正试图从两次调查(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红移目录-
VIPERS Redshift Catalog-

我认为有几种方法可以让你做到这一点,因为你没有有效地使用现有的可用工具,这会让你自己变得更加困难。例如,由于您正在使用FITS文件中的表格数据,因此可以利用Astropy的界面:

>>> 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    
在进行性能比较的过程中,我意识到这一行可能会出现错误
indexer错误:数组的索引太多了

>>> np.array(filter(lambda x: x[3].strip() == 'xmm', primus))
array(<filter object at 0x7f5170981940>, dtype=object)
不必要。特别是,前三列已经是浮点格式,因此无论如何这都不是必需的

一些类似的建议也适用于代码的其他部分。我会写得更像这样:

import numpy as np
from astropy.table import Table, vstack
from astropy import units as u
from astropy.coordinates import SkyCoord

primus = Table.read('PRIMUS_2013_zcat_v1.fits')
primus_field = primus['FIELD']
primus = primus[['RA', 'DEC', 'Z']]
primus = primus[np.char.startswith(primus_field, b'xmm')]
vipers = Table.read('VIPERS_W1_SPECTRO_PDR2.fits')[['alpha', 'delta', 'zspec']]

primus_catalog = SkyCoord(ra=primus['RA']*u.degree, dec=primus['DEC']*u.degree)
vipers_catalog = SkyCoord(ra=vipers['alpha']*u.degree, dec=vipers['delta']*u.degree)
idx, d2d, d3d = primus_catalog.match_to_catalog_sky(vipers_catalog)
feasible_indices = idx[d2d > 1e-3]
vipers = vipers[feasible_indices]
vipers.rename_columns(['alpha', 'delta', 'zspec'], ['RA', 'DEC', 'Z'])
hz = vstack(primus, vipers)

如果您对此有任何疑问,请告诉我。

您的代码格式中有很多多余的空格,这有点奇怪。甚至连文件名都有,比如
'data/PRIMUS\u 2013\u zcat\u v1。适合'
,这不可能是正确的。当您收到错误消息时,请同时发布完整的回溯,因为它将准确显示错误发生在哪一行。稍后我将继续发表更实质性的评论。我继续清理了大部分代码格式,以更标准的方式使用空格。现在我试着回答。
np.array(map(lambda x: [float(x[0]), float(x[1]), float(x[2])], data_PRIMUS))
import numpy as np
from astropy.table import Table, vstack
from astropy import units as u
from astropy.coordinates import SkyCoord

primus = Table.read('PRIMUS_2013_zcat_v1.fits')
primus_field = primus['FIELD']
primus = primus[['RA', 'DEC', 'Z']]
primus = primus[np.char.startswith(primus_field, b'xmm')]
vipers = Table.read('VIPERS_W1_SPECTRO_PDR2.fits')[['alpha', 'delta', 'zspec']]

primus_catalog = SkyCoord(ra=primus['RA']*u.degree, dec=primus['DEC']*u.degree)
vipers_catalog = SkyCoord(ra=vipers['alpha']*u.degree, dec=vipers['delta']*u.degree)
idx, d2d, d3d = primus_catalog.match_to_catalog_sky(vipers_catalog)
feasible_indices = idx[d2d > 1e-3]
vipers = vipers[feasible_indices]
vipers.rename_columns(['alpha', 'delta', 'zspec'], ['RA', 'DEC', 'Z'])
hz = vstack(primus, vipers)