#python #coordinates #matching #catalog #astropy
#python #координаты #сопоставление #каталог #astropy
Вопрос:
Я пытаюсь сопоставить источники каталога, используя пакет координат astropy, и у меня есть три разных файла данных. Моя конечная цель состоит в том, чтобы все три файла содержали данные для одних и тех же точных источников.
Я думал, что понял это, потому что, когда я сравниваю файлы F435W.csv
и F550M.csv
, код, похоже, работает, и в обоих получается одинаковое количество источников, как я и хотел. Когда я использую тот же точный код для сравнения моего третьего файла F625W.csv
с F435W.csv
, я получаю IndexError: index 6442 is out of bounds for axis 0 with size 6348
. Почему я должен получать эту ошибку с одним файлом, но не с другим?
Существует значительная разница между количеством источников между всеми тремя файлами, что, я думаю, обычно вызывает эту ошибку, но не имеет смысла, почему это будет работать с первыми двумя файлами с разной длиной массива, но не с третьим файлом с длиной массива, отличной от первых двух.
import numpy as np
my_csv1 = np.genfromtxt('./F435W.csv', delimiter=',', dtype=float)
ra1, dec1 = my_csv1[:, 12], my_csv1[:, 13]
my_csv2 = np.genfromtxt('./F625W.csv', delimiter=',', dtype=float)
ra2, dec2 = my_csv2[:, 12], my_csv2[:, 13]
from astropy.coordinates import SkyCoord
from astropy import units as u
from astropy.coordinates import match_coordinates_sky
c = SkyCoord(ra1, dec1, frame='icrs', unit='deg')
catalog = SkyCoord(ra2, dec2, frame='icrs', unit='deg')
max_sep = 2.0*u.arcsec
idx, sep, _ = c.match_to_catalog_sky(catalog)
sep_constraint = idx[sep < max_sep]
c_matches = c[sep_constraint]
catalog_matches = c[idx[sep_constraint]]
print (len(c_matches), len(catalog_matches))
При использовании F435W.csv
и F550M.csv
моего кода выводятся длины массивов 4703 4703
, поэтому они имеют одинаковую длину и одинаковое количество источников. Когда я меняю F550M.csv
на F625.csv
, я получаю IndexError
. Согласно информации об ошибке, похоже, что она поступает из строки 19 c_matches = c[sep_constraint]
Комментарии:
1. Я ничего не знаю о numpy и не изучал внимательно ваш код. Я полагаю, что это тоже не проблема, но что-то кажется мне странным… эта строка: sep_constraint = idx[sep < max_sep] . Разве это не индексирование списка idx по логическому значению? Это действительно то, что вы хотите / имеете в виду? Просто любопытно больше всего
2. @Steve, Не зная больше о том, что такое
sep_constraint
иsep
, трудно сказать, но это может быть допустимый код — индексированиеnumpy
массива с использованием логической маски.3. Да, это то, что я имею в виду, главным образом потому, что, когда я просмотрел документацию по сопоставлению координат с astropy, там указано, что это делается при необходимости использовать максимальное разделение для координат, которые считаются совпадением. Это то, что я использовал в качестве руководства для своего кода. В нем говорилось что-то вроде этого и приводился пример, аналогичный коду, который я использовал: «Можно наложить ограничение на разделение (например, максимальное разделение, которое будет считаться совпадением), создав логическую маску ….»
4. Классные ребята. Как я уже сказал, мне было просто любопытно. Я понимаю, что определение возможных типов индексов зависит от базового объекта, так что все хорошо! Спасибо за образование. На днях я, возможно, действительно использую numpy. — мой коллега использует это постоянно. Иногда кажется, что numpy и pandas захватывают мир Python, lol.
5. Вы используете Linux? Если это так, то каковы выходные данные
wc -l
для каждого файла?