Сравнение двух списков звездных координат xy для поиска подходящих объектов - PullRequest
1 голос
/ 06 февраля 2020

У меня есть два файла .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 я хочу найти звезду в файл 2, который наиболее точно соответствует координатам xy по формуле расстояния: 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 должна проходить тест, как указано * index (который идет от idl, в который я более разбираюсь). Есть ли решение для этой логики c, в отличие от мышления в этом случае:

Сравнение двух независимых списков координат изображения с одинаковым масштабом, но координатной сеткой, имеющей некоторое вращение и смещение

Заранее спасибо!

1 Ответ

1 голос
/ 06 февраля 2020

Вы можете использовать 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')
...