色分解、オフセット、ディレクトリマッチング、および関連機能¶
astropy.coordinates
座標オブジェクトを比較または一致させるための一般的なツールを含む。特に、座標間の分離を決定することと、座標(または複数の座標)をディレクトリと一致させる分離とを決定することが重要である。これらは主に座標オブジェクト上の方法として実現される.
退職する.¶
空の間隔は使えます astropy.coordinates.BaseCoordinateFrame.separation()
あるいは…。 astropy.coordinates.SkyCoord.separation()
方法、この方法は、大円距離を計算する( not 小角度近似):
>>> import numpy as np
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> c1 = SkyCoord('5h23m34.5s', '-69d45m22s', frame='icrs')
>>> c2 = SkyCoord('0h52m44.8s', '-72d49m43s', frame='fk5')
>>> sep = c1.separation(c2)
>>> sep
<Angle 20.74611448 deg>
戻る対象は1つです Angle
したがって、例は、以下のいくつかの等価角度単位のいずれかの単位アクセス角度を使用することができる。
>>> sep.radian
0.36208800460262563
>>> sep.hour
1.3830742984029318
>>> sep.arcminute
1244.7668685626384
>>> sep.arcsecond
74686.0121137583
また、2つの入力座標は同じフレームにはなく、一方は自動的に他方と一致するように変換され、異なるフレームに位置していても、分離が一致して決定されることを保証することに留意されたい。
上記の空中分離を除いて astropy.coordinates.BaseCoordinateFrame.separation_3d()
あるいは…。 astropy.coordinates.SkyCoord.separation_3d()
方法:以下の属性を有する2つの座標間の3 D距離を決定する distance
定義::
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> c1 = SkyCoord('5h23m34.5s', '-69d45m22s', distance=70*u.kpc, frame='icrs')
>>> c2 = SkyCoord('0h52m44.8s', '-72d49m43s', distance=80*u.kpc, frame='icrs')
>>> sep = c1.separation_3d(c2)
>>> sep
<Distance 28.74398816 kpc>
ずれ量¶
角度分離と密接に関連するのは座標間のオフセットである.オフセットの重要な区別は、一般に、分離された単一のスカラ角度オフセットではなく、“から”および“座標へ”の概念である。 coordinates
天文学で遭遇するいくつかのよく見られるオフセットを計算する利便性を含む.
このような機能の最初の部分は position_angle()
方法です。この方法で計算する SkyCoord
例と天文学的約束に従ったもう1つ(パラメータ伝達として)(北以東の正の角度):
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> c1 = SkyCoord(1*u.deg, 1*u.deg, frame='icrs')
>>> c2 = SkyCoord(2*u.deg, 2*u.deg, frame='icrs')
>>> c1.position_angle(c2).to(u.deg)
<Angle 44.97818294 deg>
この2つの技術の結合は separation()
そして position_angle()
これにより、方向ずれ量のセットが与えられる。逆の動作を実行する−間隔および位置角度が与えられた場合に、新たな“目標”座標を決定する− directional_offset_by()
方法を提供しました:
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> c1 = SkyCoord(1*u.deg, 1*u.deg, frame='icrs')
>>> position_angle = 45 * u.deg
>>> separation = 1.414 * u.deg
>>> c1.directional_offset_by(position_angle, separation)
<SkyCoord (ICRS): (ra, dec) in deg
(2.0004075, 1.99964588)>
この技術は、球面ジオメトリ(すなわち、それぞれ平均RAS/DECではない)を考慮することで、2つの座標間の中点(または実際の任意の点)を計算する際にも有用である。
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> coord1 = SkyCoord(0*u.deg, 0*u.deg, frame='icrs')
>>> coord2 = SkyCoord(1*u.deg, 1*u.deg, frame='icrs')
>>> pa = coord1.position_angle(coord2)
>>> sep = coord1.separation(coord2)
>>> coord1.directional_offset_by(pa, sep/2)
<SkyCoord (ICRS): (ra, dec) in deg
(0.49996192, 0.50001904)>
一つもあります spherical_offsets_to()
角度オフセットを計算する方法(例えば、望遠鏡オペレータに明るい恒星からより暗いターゲットへの小さなオフセットを移動させる可能性がある):
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> bright_star = SkyCoord('8h50m59.75s', '+11d39m22.15s', frame='icrs')
>>> faint_galaxy = SkyCoord('8h50m47.92s', '+11d39m32.74s', frame='icrs')
>>> dra, ddec = bright_star.spherical_offsets_to(faint_galaxy)
>>> dra.to(u.arcsec)
<Angle -173.78873354 arcsec>
>>> ddec.to(u.arcsec)
<Angle 10.60510342 arcsec>
“空のずれ”枠¶
球形オフセットの概念を拡張するために coordinates
Frame類があります SkyOffsetFrame
これは特定の点を中心とした異なるフレームを作成するだろう。これらのフレームは、空の任意の位置を中心としたフレームを作成する便利な方法であるので、位置オフセット(例えば、天文測定のために使用される)を計算するのに適しているので、“天空オフセットフレーム”と呼ばれる。
>>> from astropy import units as u
>>> from astropy.coordinates import SkyOffsetFrame, ICRS, SkyCoord
>>> center = ICRS(10*u.deg, 45*u.deg)
>>> center.transform_to(SkyOffsetFrame(origin=center))
<SkyOffsetICRS Coordinate (rotation=0.0 deg, origin=<ICRS Coordinate: (ra, dec) in deg
(10., 45.)>): (lon, lat) in deg
(0., 0.)>
>>> target = ICRS(11*u.deg, 46*u.deg)
>>> target.transform_to(SkyOffsetFrame(origin=center))
<SkyOffsetICRS Coordinate (rotation=0.0 deg, origin=<ICRS Coordinate: (ra, dec) in deg
(10., 45.)>): (lon, lat) in deg
(0.69474685, 1.00428706)>
あるいは、便利な方法 skyoffset_frame()
既存の空のずれ枠からスカイオフセット枠を作成することができます SkyCoord
**
>>> center = SkyCoord(10*u.deg, 45*u.deg)
>>> aframe = center.skyoffset_frame()
>>> target.transform_to(aframe)
<SkyOffsetICRS Coordinate (rotation=0.0 deg, origin=<ICRS Coordinate: (ra, dec) in deg
(10., 45.)>): (lon, lat) in deg
(0.69474685, 1.00428706)>
>>> other = SkyCoord(9*u.deg, 44*u.deg, frame='fk5')
>>> other.transform_to(aframe)
<SkyCoord (SkyOffsetICRS: rotation=0.0 deg, origin=<ICRS Coordinate: (ra, dec) in deg
(10., 45.)>): (lon, lat) in deg
(-0.71943945, -0.99556216)>
注釈
While sky offset frames appear to be all the same class, this not the
case: the sky offset frame for each different type of frame for origin
is
actually a distinct class. E.g., SkyOffsetFrame(origin=ICRS(...))
yields an object of class SkyOffsetICRS
, not SkyOffsetFrame
.
While this is not important for most uses of this class, it is important for
things like type-checking, because something like
SkyOffsetFrame(origin=ICRS(...)).__class__ is SkyOffsetFrame
will
not be True
, as it would be for most classes.
同様のフレームワークは、銀河群などの階層物理システムに非常に有用な特定の既知オブジェクトに対するフレームを定義するツールとしても使用することができる。例えば、M 31の周囲のオブジェクトは、標準ICRA/DECと整列した座標枠に表示される場合があるが、M 31::
>>> m31 = SkyCoord(10.6847083*u.deg, 41.26875*u.deg, frame='icrs')
>>> ngc147 = SkyCoord(8.3005*u.deg, 48.5087389*u.deg, frame='icrs')
>>> ngc147_inm31 = ngc147.transform_to(m31.skyoffset_frame())
>>> xi, eta = ngc147_inm31.lon, ngc147_inm31.lat
>>> xi
<Longitude -1.59206948 deg>
>>> eta
<Latitude 7.26183757 deg>
注釈
現在のところ origin
一種 SkyOffsetFrame
計算変換のどの部分にも使用されない.♪the origin
空中回転にのみ用いられる。しかし、この状況は未来に変わるかもしれない。
カタログにマッチする¶
coordinates
座標フレームを用いて,必要な1組の他の座標に最も近い座標をディレクトリに見つけることができる.例えば仮定すると ra1
/dec1
そして ra2
/dec2
NumPy配列があるファイルからロードされているかどうか:
>>> from astropy.coordinates import SkyCoord
>>> from astropy import units as u
>>> c = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree)
>>> catalog = SkyCoord(ra=ra2*u.degree, dec=dec2*u.degree)
>>> idx, d2d, d3d = c.match_to_catalog_sky(catalog)
戻り距離 d3d
三次元距離です。この2つのソースがない限り (c
)とカタログ (catalog
)座標が関連する距離を有する場合、この数は、全ての震源の距離が1(無次元)であると仮定する。
上に表示された空中分離とは異なり、座標が使用される場合にのみ、最も近い3 Dマッチングを見つけることができます。 distance
:
>>> c = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree, distance=distance1*u.kpc)
>>> catalog = SkyCoord(ra=ra2*u.degree, dec=dec2*u.degree, distance=distance2*u.kpc)
>>> idx, d2d, d3d = c.match_to_catalog_3d(catalog)
Now idx
are indices into catalog
that are the closest objects to each
of the coordinates in c
, d2d
are the on-sky distances between them, and
d3d
are the 3-dimensional distances. Because coordinate objects support
indexing, idx
enables easy access to the matched set of coordinates in
the catalog:
>>> matches = catalog[idx]
>>> (matches.separation_3d(c) == d3d).all()
True
>>> dra, ddec = c.spherical_offsets_to(matches)
この機能は match_coordinates_sky()
そして match_coordinates_3d()
機能します。これらはいずれも以下の2つの場合で動作可能である. SkyCoord
対象者. or 下位レベルのフレームワーククラス:
>>> from astropy.coordinates import match_coordinates_sky
>>> idx, d2d, d3d = match_coordinates_sky(c, catalog)
>>> idx, d2d, d3d = match_coordinates_sky(c.frame, catalog.frame)
分離制約(例えば、一致する最大分離とみなされる)は、以下のものを使用してブーリアンマスクを作成することによって適用されることができる d2d
あるいは…。 d3d
それがそうです。例:
>>> max_sep = 1.0 * u.arcsec
>>> idx, d2d, d3d = c.match_to_catalog_3d(catalog)
>>> sep_constraint = d2d < max_sep
>>> c_matches = c[sep_constraint]
>>> catalog_matches = catalog[idx[sep_constraint]]
今、 c_matches
そして catalog_matches
一致した信号源があるかどうか c
そして catalog
これらの間隔は、1コーナー秒未満である。
座標周辺を探索する¶
密接に関連した機能を検索することができます all 別の座標のセットの特定の距離(3 D距離または空中距離)内の座標。♪the search_around_*
方法(および関数)はこの機能を提供し,そのインタフェースは非常に類似している. match_coordinates_*
:
>>> import numpy as np
>>> idxc, idxcatalog, d2d, d3d = catalog.search_around_sky(c, 1*u.deg)
>>> np.all(d2d < 1*u.deg)
True
>>> idxc, idxcatalog, d2d, d3d = catalog.search_around_3d(c, 1*u.kpc)
>>> np.all(d3d < 1*u.kpc)
True
これらの方法の重要な違いは,複数の(またはない)マッチングが可能であることである catalog
どの場所の近くでも c
それがそうです。この2つに索引すると c
そして catalog
インデックスを返すだけではなく catalog
それがそうです。そして,これらのインデックスを2つに新たに組み込むことができる SkyCoord
オブジェクト、または同じ順序を有する任意の配列:
>>> np.all(c[idxc].separation(catalog[idxcatalog]) == d2d)
True
>>> np.all(c[idxc].separation_3d(catalog[idxcatalog]) == d3d)
True
>>> print(catalog_objectnames[idxcatalog])
['NGC 1234' 'NGC 4567' ...]
ただし、この二重索引は search_around_*
座標のうちの1つがスカラーである場合、返されたインデックスは、スカラーについて:
>>> scalarc = SkyCoord(ra=1*u.deg, dec=2*u.deg, distance=distance1*u.kpc)
>>> idxscalarc, idxcatalog, d2d, d3d = catalog.search_around_sky(scalarc, 1*u.deg)
ValueError: One of the inputs to search_around_sky is a scalar.
(そしてそのために search_around_*
アルゴリズムはスカラーの場合効率が悪い),この場合の最適な方法は変更である. separation*
方法:
>>> d2d = scalarc.separation(catalog)
>>> catalogmsk = d2d < 1*u.deg
>>> d3d = scalarc.separation_3d(catalog)
>>> catalog3dmsk = d3d < 1*u.kpc
ここから生まれたのは catalogmsk
あるいは…。 catalog3dmsk
変数はインデックス配列ではなくブール配列であるが,実際にはそれらの使用方式は通常 idxcatalog
上の例から分かる.ブーリアンマスクではなくインデックスが必要である場合、以下の動作を実行することができる。
>>> idxcatalog = np.where(catalogmsk)[0]
>>> idxcatalog3d = np.where(catalog3dmsk)[0]