首页 > 解决方案 > 比较两个恒星 xy 坐标列表以找到匹配的对象

问题描述

我有两个 .txt 文件,其中包含图像中数千颗星星的 x 和 y 像素坐标。这两个不同的坐标列表是不同数据处理方法的产物,导致同一物体的 x 和 y 值略有不同。

文件 1 *id_out 是任意的

id_out  x_out       y_out         m_out
0       803.6550    907.0910     -8.301
1       700.4570    246.7670     -8.333
2       802.2900    894.2130     -8.344
3       894.6710    780.0040     -8.387

文件 2

xcen      ycen      mag           merr
31.662    37.089    22.759        0.387
355.899   37.465    19.969        0.550
103.079   37.000    20.839        0.847
113.500   38.628    20.966        0.796

.txt 文件中列出的对象的组织方式无法让我在两个文件中识别相同的对象。所以,我想对于文件 1 中的每个对象,比文件 2 的对象少,我会进行测试以找到文件 1 和文件 2 之间的星形匹配。对于文件 1 中的每个星,我想在使用距离公式与 xy 坐标最匹配的文件 2:distance= sqrt((x1-x2)^2 + (y1-y2)^2) 在我可以更改的距离的某个公差范围内。然后将文件中的 x1、y1、x2、y2、m_out、mag 和 merr 参数打印到主列表中。

这是我到目前为止的代码,但我不确定如何找到可行的解决方案。

#/usr/bin/python
import pandas
import numpy as np

xcen_1 = np.genfromtxt('file1.txt', dtype=float, usecols=1)
ycen_1 = np.genfromtxt('file1.txt', dtype=float, usecols=2)
mag1 = np.genfromtxt('file1.txt', dtype=float, usecols=3)

xcen_2 = np.genfromtxt('file2.txt', dtype=float, usecols=0)
ycen_2 = np.genfromtxt('file2.txt', dtype=float, usecols=1)
mag2 = np.genfromtxt('file2.txt', dtype=float, usecols=2)
merr2 = np.genfromtxt('file2.txt', dtype=float, usecols=3)

tolerance=10.0

i=0
file=open('results.txt', 'w+')
file.write("column names")
for i in len(xcen_1):
    dist=np.sqrt((xcen_1[i]-xcen_2[*])^2+(ycen_1[i]-ycen_2[*]^2))
    if dist < tolerance:
        f.write(i, xcen_1, ycen_1, xcen_2, ycen_2, mag1, mag2, merr2)
    else:
        pass
    i=i+1
file.close

代码不起作用,因为我不知道如何实现文件 2 中的每个星都必须通过测试,如 * 索引所示(来自 idl,我更精通)。与这种情况下的想法相反,是否有解决此逻辑的方法:

比较两个具有相同比例但坐标网格具有一些旋转和移位的独立图像坐标列表

提前致谢!

标签: pythonpython-2.7numpy

解决方案


您可以使用pandas Dataframes. 就是这样:

import pandas as pd
# files containing the x and y pixel coordinates and other information
df_file1=pd.read_csv('file1.txt',sep='\s+')
df_file2=pd.read_csv('file2.txt',sep='\s+')
join=[]
for i in range(len(df_file1)):
    for j in range(len(df_file2)):
        dis=((df_file1['x_out'][i]-df_file2['xcen'][j])**2+(df_file1['y_out'][i]-df_file2['ycen'][j])**2)**0.5
        if dis<10:
            join.append({'id_out': df_file1['id_out'][i], 'x_out': df_file1['x_out'][i], 'y_out':df_file1['y_out'][i], 
                         'm_out':df_file1['m_out'][i],'xcen':df_file2['xcen'][j],'ycen':df_file2['ycen'][j],
                         'mag':df_file2['mag'][j],'merr':df_file2['merr'][j]})

df_join=pd.DataFrame(join) 
df_join.to_csv('results.txt', sep='\t')

推荐阅读