Astropy: «ValueError: один из входных данных для search_around_sky является скаляром» в search_around_sky - PullRequest
0 голосов
/ 29 марта 2019

Я хотел бы получить хорошее объяснение или пример о том, как работает Astropy search_around _ *.К сожалению, учебник с официальной страницы мне не помогает.

У меня есть каталог источников наземной правды (GT).У меня также есть некоторые патчи (подходит для изображений), которые включают некоторые из тех, которые включены в мой каталог GT.Я хочу выяснить, , какие из источников в моем каталоге GT включены в патч для изображения соответствия .

Мой каталог GT организован почти так: ID ... RA, декабрь..и это текстовый файл

Так что я хочу вернуть, какие координаты в GT включены в патч.

То, что я сделал, я получил WCS из заголовкапатча и у меня Всемирный центр изображения.Затем я попытался проверить фактический код, предоставленный официальной документацией (http://docs.astropy.org/en/stable/coordinates/matchsep.html).

. Я использовал следующий код, предполагая, что 2-й аргумент search_around_sky - это градусы, по которым он ищет (??)

x,y,w=patch_celestial_center(patch=None) #x,y are the World center of the patch
c=SkyCoord(ra=x*u.deg,dec=y*u.deg,  frame=FK5)

cat=ascii.read("$training_set.txt")

catalogue_coo=SkyCoord(cat["RA(core)"]*u.deg, cat["DEC(core)"]*u.deg, frame=FK5)

idx_1, idx_2 d2d_, d3d_ = catalogue_coo.search_around_sky(c, 1*u.deg)

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "$$/train_utils.py", line 49, in <module>
    x,y,w=patch_celestial_center(patch=None)
  File "$$train_utils.py", line 43, in patch_celestial_center
    idxc, idxcatalog, d2d, d3d = catalog.search_around_sky(c, 1 * u.deg)
  File "$$/lib/python3.5/site-packages/astropy/coordinates/sky_coordinate.py", line 1170, in search_around_sky
    storekdtree='_kdtree_sky')
  File "$$/lib/python3.5/site-packages/astropy/coordinates/matching.py", line 330, in search_around_sky
    raise ValueError('One of the inputs to search_around_sky is a scalar. '
ValueError: One of the inputs to search_around_sky is a scalar. search_around_sky is intended for use with array coordinates, not scalars.  Instead, use ``coord1.separation(coord2) < seplimit`` to find the coordinates near a scalar coordinate.

Process finished with exit code 1

Это как-то связано с моими данными перед тестированием? Это из-за формирования моего каталога?

Я что-то не понимаю в функциональности search_around_sky?

Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Это «скаляр» в этом смысле, потому что это всего лишь одна координата (которую математически мы можем не считать скаляром, но, поскольку SkyCoord может содержать массив координат, это скаляр SkyCoord).Я действительно думаю, что это немного странно, что функция search_around_sky не может принять скалярную координату, потому что она в принципе может обнаружить этот случай (на самом деле это уже делает, и вызывает конкретное исключение, которое вы получаете), но вместо того, чтобы вызвать исключение, этоможет попытаться «продвинуть» ваш аргумент в однокоординатный массив.Но я также частично понимаю причину.

Согласно этим документам идея состоит в том, что вы должны быть в состоянии вызвать catalog.search_around_sky(some_coords, ...) и получить пару массивов индексов в оба some_coordsи в catalog, где совпадающие координаты находятся в каждом из соответствующих массивов координат.Более того, каждый из этих массивов индексов должен иметь одинаковый размер и форму, поскольку совпадения должны быть найдены в каждом из массивов координат.

Так что, если вы вводите «координаты», это просто одна координата ине массив, логика этой функции не имеет никакого смысла.Об этом также говорится в документах:

Обратите внимание, что это двойное индексирование означает, что search_around_* не работает хорошо, если одна из координат является скалярной, потому что возвращаемый индекс будетне имеет смысла для скаляра:

>>> scalarc = SkyCoord(1*u.deg, 2*u.deg)  
>>> idxscalarc, idxcatalog, d2d, d3d = catalog.search_around_sky(scalarc, 1*u.deg)  
# THIS DOESN'T ACTUALLY WORK  
>>> scalarc[idxscalarc]  
IndexError: 0-d arrays can't be indexed

В результате (и поскольку алгоритм search_around_* неэффективен в скалярном случае, в любом случае), лучший подход для этого сценариявместо этого использовать separation* методы:

 >>> d2d = scalarc.separation(catalog)  
 >>> catalogmsk = d2d < 1*u.deg  
 >>> d3d = scalarc.separation_3d(catalog)  
 >>> catalog3dmsk = d3d < 1*u.kpc  

В этом примере d2d - это массив двумерных расстояний между scalarc и координатами в catalog.Тогда catalogmsk - это логическая маска тех элементов в catalog, где расстояние было меньше 1 градуса.Затем вы можете использовать эту маску для извлечения этих элементов именно из catalog, например catalog[catalogmsk].Или вы можете пропустить назначение маски для промежуточной переменной полностью и просто, например, сделать catalog[d2d < 1*u.deg].

Если вы посмотрите на реализацию search_around_sky , вы увидите, что она использует SkyCoord.separation внутренне, но все еще немного сложнее, потому что для эффективного поиска совпадающих пар координат необходимо использовать методы поиска.

Если у вас есть только одна координата, вы хотите найти совпадения в пределах некоторого расстояния от координатв каталоге гораздо проще и проще использовать метод SkyCoord.separation напрямую, как описано выше.

0 голосов
/ 01 апреля 2019

Проблема была с c=SkyCoord(ra=x*u.deg,dec=y*u.deg, frame=FK5). Который считался (не знаю почему) скалярным.

search_around_sky принимает координаты массива .

Так что работает нормально, когда вместо c=SkyCoord(ra=x*u.deg,dec=y*u.deg, frame=FK5)
Я использовал: c=SkyCoord(ra=[x]*u.deg,dec=[y]*u.deg, frame=FK5)

...