找到数据中每个星系之间的最近距离,并根据它们之间的最近距离创建对

时间:2017-12-05 15:03:51

标签: python-3.x loops itertools astropy fits

我的任务是将一大群星系中最接近的星系配对。我有每个的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))

但我并非真正理解这一点,所以不能轻易应用它。我已经尝试了,但没有任何用处。

非常感谢任何帮助,谢谢

1 个答案:

答案 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。它似乎专注于直线坐标,但应该在线性时间内可以解决。