坐标的快速在位修改#

对于某些应用,推荐的方法 在位修改坐标对象 由于在该过程中进行了大量验证以确保正确性,可能不够快。同样,您可能会发现使用不同的数据创建另一个坐标系 realize_frame 不符合您的性能要求。

对于这些高性能的情况,可以直接在位修改框架对象中的表示数据,如下例所示:

>>> import astropy.units as u
>>> from astropy.coordinates import SkyCoord
>>> sc = SkyCoord([1,2],[3,4], unit='deg')
>>> sc.data.lon[()] = [10, 20] * u.deg
>>> sc.data.lat[1] = 40 * u.deg

>>> sc.cache.clear()  # IMPORTANT TO DO THIS!

>>> sc  
<SkyCoord (ICRS): (ra, dec) in deg
    [(10., 3.), (20., 40.)]>

请注意, .data 表示对象使用的组件名称与坐标对象中的名称不同。如果您希望检查帧属性之间的映射(例如, .ra )和表示属性(例如, .lon )您可以查看以下词典:

>>> sc.representation_component_names
{'ra': 'lon', 'dec': 'lat', 'distance': 'distance'}

警告

must 包括清除缓存的步骤,如图所示。否则,将导致对象不一致,并可能导致不正确的结果。 SkyCoordBaseCoordinateFrame 出于性能原因,缓存各种信息,因此需要清除缓存,以便在需要时使用新的表示值。

您应该注意,修改帧中数据的唯一方法是使用 .data 直接属性,而不是框架上组件的别名。例如,以下将 出现 若要给出正确的结果,但实际上并不修改基础表示数据:

>>> sc.ra[1] = 20 * u.deg  # THIS IS WRONG

此问题与基于性能的缓存的当前实现有关,无法轻松解决。