Astropy:search_around_sky中的“ValueError:search_around_sky的输入之一是标量”

问题描述 投票:0回答:2

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

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

我的GT目录几乎是这样组织的:ID ... RA,Dec ...它是一个.txt文件

所以我想回答补丁中包含哪些GT中的coords。

我所做的是,我从补丁的标题中获得了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功能的东西吗?

请帮忙!

python astronomy astropy fits
2个回答
0
投票

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


0
投票

它在这个意义上是一个“标量”,因为它只是一个单一的坐标(在数学上我们可能不会认为它是一个标量,但由于SkyCoord可以容纳一个坐标数组,它是SkyCoord的标量)。我认为search_around_sky函数不能接受标量坐标有点奇怪,因为它原则上可以检测到这种情况(事实上它已经做了,并引发了你得到的特定异常)但是它没有引发异常,而是可以尝试将你的论证“提升”到单坐标数组。但我也部分理解了推理。

根据these docs的观点,你应该能够调用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  

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

如果你看看the implementation of search_around_sky你可以看到它在内部使用SkyCoord.separation,但仍然相当复杂,因为它需要使用搜索技术来有效地找到匹配的坐标对。

如果你只想要一个坐标,你想在目录中的某个坐标距离内找到匹配,那么直接使用SkyCoord.separation方法会更加简单和直接,如上所述。

© www.soinside.com 2019 - 2024. All rights reserved.