[英]"IndexError: too many indices for array" while merging VIPERS and PRIMUS
嗨,我正在嘗試從兩個調查(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))
當我運行這個時,我得到一個“IndexError:數組的索引太多”
數據集:PRIMUS Redshift Catalog - https://primus.ucsd.edu/version1.html VIPERS Redshift Catalog - 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
然后,您似乎使用filter
函數選擇字段為xmm
的RA
、 DEC
和Z
列,但由於這些是 Numpy 數組,因此您可以使用 Numpy 數組索引和表索引中內置的過濾功能。 唯一棘手的部分是,由於這些是固定寬度的字符字段,您仍然需要正確執行比較。 您可以為此使用 Numpy 的字符串函數,例如np.char.startswith
:
>>> primus = primus[np.char.startswith(primus['FIELD'], b'xmm')]
在進行性能比較的過程中,我意識到這一行是您可能收到錯誤IndexError: too many indices for array
:
>>> np.array(filter(lambda x: x[3].strip() == 'xmm', primus))
array(<filter object at 0x7f5170981940>, dtype=object)
在 Python 3 中, filter
函數返回一個可迭代對象,因此將它包裝在np.array()
只會生成一個包含此 Python 對象的 0 維數組; 這可能不是你想要的,所以它在這里失敗了(這是查看回溯可能有用的地方)。 即使您將filter()
調用包裝在list()
它也不起作用,因為np.array()
通常只采用同構數組。 所以像我給出的方法是完全足夠的(盡管可能有更有效的方法)。 它還使下一行:
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)
如果您對此有任何疑問,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.