Как исправить ошибку индекса при попытке сопоставить каталоги с использованием координат астропии

#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 для каждого файла?