如何匹配三个不完全相等的数组的坐标?

时间:2017-07-05 07:49:24

标签: python arrays

我有六个阵列,其天文图像中的探测源坐标。每个阵列在观察的特定过滤器(r,i,z)中具有源的正确提升或下降。这些头寸不会100%相等(浮点数)。 我发现可以找到整数的匹配对,可以检查是否相等(How can I find identical x,y coordinates in two arrays of corrdinates?)。 但是如何找到浮点数的匹配对?我的想法是检查两个位置之间的距离是否小于距离dist = 0.5 / 3600(所以0.5弧秒)。然后我认为这两个来源是同一个对象。一旦找到三个过滤器中的匹配对,我想将一些关于该源的信息(大小)附加到列表中。 这是我试过的代码:

# open the relevant catalogs
cat_r = pyfits.open("%s/%s_R_for_calib.cat" %(cluster,cluster))[2].data
cat_i = pyfits.open("%s/%s_I_for_calib.cat" %(cluster,cluster))[2].data
cat_z = pyfits.open("%s/%s_Z_for_calib.cat" %(cluster,cluster))[2].data

mask_r = cat_r['FLAGS'] == 0
mask_i = cat_i['FLAGS'] == 0
mask_z = cat_z['FLAGS'] == 0

# get the information needed for the analysis
cat_r_MAG               = cat_r.field("MAG_AUTO")[mask_r]
cat_i_MAG               = cat_i.field("MAG_AUTO")[mask_i]
cat_z_MAG               = cat_z.field("MAG_AUTO")[mask_z]
cat_r_MAG_ERR           = cat_r.field("MAGERR_AUTO")[mask_r]
cat_i_MAG_ERR           = cat_i.field("MAGERR_AUTO")[mask_i]
cat_z_MAG_ERR           = cat_z.field("MAGERR_AUTO")[mask_z]
cat_r_ra = cat_r.field("ALPHA_J2000")[mask_r]
cat_r_dec = cat_r.field("DELTA_J2000")[mask_r]
cat_i_ra = cat_i.field("ALPHA_J2000")[mask_i]
cat_i_dec = cat_i.field("DELTA_J2000")[mask_i]
cat_z_ra = cat_z.field("ALPHA_J2000")[mask_z]
cat_z_dec = cat_z.field("DELTA_J2000")[mask_z]

dist = 0.5 / 3600
matches = []

for a in range(0,len(cat_r_ra)):
    for b in range(0,len(cat_i_ra)):
        for c in range(0,len(cat_z_ra)):
            if np.sqrt((cat_r_ra[a] - cat_i_ra[b])**2 + (cat_r_dec[a] - cat_i_dec[b])**2) < dist and np.sqrt((cat_r_ra[a] - cat_z_ra[c])**2 + (cat_r_dec[a] - cat_z_dec[c])**2 < dist):
                match = [cat_r_ra[a], cat_r_dec[a], cat_r_MAG[a], cat_r_MAG_ERR[a], cat_i_MAG[b], cat_i_MAG_ERR[b], cat_z_MAG[c], cat_z_MAG_ERR[c]] 
                matches.append(match)
matches = np.array(matches)

问题是,运行需要很长时间。我认为for循环和if语句的组合减慢了它的速度。但我仍然相当陌生的编程,所以我不知道更有效的方式。有没有一种有效的方法在python中找到匹配的源达到一定的准确度(在这种情况下为0.5 / 3600)?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以事先尝试对阵列进行舍入。使用您链接的主题中建议的方法,这将为您提供:

import numpy as np
A = np.array([[ 2.31,  1, 4.33],
              [ 4.46,  3, 10.75]])

B = np.array([[ 2.34,  3,  4.34],
              [ 4.47, 11, 10.78]])

roundedA = np.around(A, decimals=1)
roundedB = np.around(B, decimals=1)

print('%s\n%s\n' % (roundedA, roundedB))
print(set(zip(*roundedA)) & set(zip(*roundedB)))

输出:

[[  2.3   1.    4.3]
 [  4.5   3.   10.8]]
[[  2.3   3.    4.3]
 [  4.5  11.   10.8]]

{(4.2999999999999998, 10.800000000000001), (2.2999999999999998, 4.5)}

注意浮点错误。