天文:search_around_sky "ValueError: One of the inputs to search_around_sky is a scalar"



我想要一些关于 Astropysearch_around_*如何工作的好解释或示例。不幸的是,官方页面上的教程对我没有帮助。

我有一个包含地面实况 (GT) 来源的目录。我还有一些补丁(适合图像),其中包括我的GT目录中包含的一些补丁。我想找出我的 GT 目录中的哪些来源包含在适合图像补丁中

我的 GT 目录几乎是这样组织的: 身份证 ...RA,12月...它是一个.txt文件

所以我想返回补丁中包含 GT 中的哪些坐标。

我所做的是,我从补丁的标题中获得了WCS,并且我拥有图像的世界中心。然后我尝试测试官方文档(http://docs.astropy.org/en/stable/coordinates/matchsep.html)提供的实际代码。

我使用了以下代码,假设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功能不了解的东西吗?

请帮忙!

从这个意义上说,它是一个"标量",因为它只是一个坐标(在数学上我们可能不会将其视为标量,但由于SkyCoord可以保存坐标数组,因此它是SkyCoord的标量)。 我确实认为search_around_sky函数不能接受标量坐标有点奇怪,因为它原则上可以检测到这种情况(事实上它已经检测到,并引发了您获得的特定异常),但不是引发异常它可以尝试将您的参数"提升"到单坐标数组。但我也部分理解其中的道理。

根据这些文档,这个想法是你应该能够调用catalog.search_around_sky(some_coords, ...)并获得一对索引数组,进入some_coordscatalog其中匹配的坐标位于每个相应的坐标数组中。 此外,这些索引数组中的每一个都应该具有相同的大小和形状,因为必须在每个坐标数组中找到匹配项。

因此,如果您输入的"坐标"只是一个坐标而不是一个数组,则此函数的逻辑没有任何意义。 这在文档中也有说明:

但请注意,这种双重索引意味着如果其中一个坐标是标量,则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  

在此示例中,d2dscalarc与坐标之间的二维距离数组(以catalog为单位)。 然后catalogmsk是距离小于 1 度的那些元素的布尔掩码catalog。 然后,您可以使用此掩码专门从catalog(如catalog[catalogmsk])中检索这些元素。 或者,您可以完全跳过将掩码分配给中间变量,而只执行catalog[d2d < 1*u.deg],例如。

如果你看一下search_around_sky的实现,你会发现它在内部使用SkyCoord.separation,但仍然相当复杂,因为它需要使用搜索技术来有效地找到匹配的坐标对。

如果您只有一个坐标,想要在目录中查找坐标一定距离内的匹配项,则如上所述直接使用SkyCoord.separation方法要简单、更直接。

问题出在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)

最新更新