我的任务是将一大群星系中最接近的星系配对。我有每个的RA,DEC和Z,以及一个公式来计算每个给定数据之间的距离。但是,我无法找到一种有效的迭代整个列表的方法,以找到列表中每个星系与其他星系之间的距离,然后将每个星系与其最近的邻居进行匹配。
数据已按以下方式导入:
hdulist = fits.open("documents/RADECMASSmatch.fits")
CATAID = data['CATAID_1']
Xpos_DEIMOS_1 = data['Xpos_DEIMOS_1']
z = data['Z_1']
RA = data['RA']
DEC = data['DEC']
我尝试过类似的事情:
radiff = []
for i in range(0,n):
for j in range(i+1,n):
radiff.append(abs(RA[i]-RA[j]))
初步解决每个星系之间RA和DEC的差异,这确实有效,但我觉得必须有更好的方法。
一位朋友提出了类似的建议:
galaxy_coords = (data['RA'],data['DEC'],data['Z])
separation_matrix = np.zeros((len(galaxy_coords),len(galaxy_coords))
done = []
for i, coords1 in enumerate(galaxy_coords):
for j, coords2 in enumerate(galaxy_coords):
if (j,i) in done:
separation_matrix[i,j] += separation matrix[j,i]
continue
separation = your_formula(coords1, coords2)
separation_matrix[i,j] += separation
done.append((i,j))
但我并非真正理解这一点,所以不能轻易应用它。我已经尝试了,但没有任何用处。
非常感谢任何帮助,谢谢
答案 0 :(得分:0)
你朋友的代码似乎正在生成每对之间距离的二维数组,并利用对称性(距离(x,y)=距离(y,x))。如果使用itertools生成组合,并在同一次迭代中将your_formula(coords1, coords2)
分配给separation_matrix[i,j]
和separation_matrix[j,i]
,而不是对i,j和j进行单独的迭代,那会稍微好一些,岛
更好的可能是这个使用基于树的算法的包:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.KDTree.html。它似乎专注于直线坐标,但应该在线性时间内可以解决。