SkyCoord高級クラスを使用して

♪the SkyCoord クラスは,座標フレーム間の天体座標表現,操作,変換に簡単で柔軟なユーザインタフェースを提供する.これは低級座標フレーム類の包装器として使用される高級クラスです ICRS そして FK5 彼らは大部分の重活を担っている。

それらの主な違いは SkyCoord 低レベルのクラスもあります (座標系の使用と設計 )は以下のとおりである。

  • ♪the SkyCoord オブジェクト中のすべての内蔵とユーザが定義した座標枠のフレーム属性の和集合. astropy.coordinates.frame_transform_graph それがそうです。各フレームカテゴリは、フレームに必要な属性(例えば、春分、観測時間、または観察者位置)のみを保持する。これはつまり FK4 (附春分と観測時間)から ICRS (どちらも)戻ってこない FK4 下位クラスでは元の春分や観察時間は覚えていません。以来. SkyCoord オブジェクトはすべての属性を格納し,このような往復変換は同じ座標オブジェクトに戻る.

  • ♪the SkyCoord クラスは、様々なユーザヘッダオプションおよび利用可能なデータフォーマットに適応するために、入力に関してより柔軟であり、Frameクラスは、角度単位を有する同様の数のオブジェクトを受信することを望む。

  • ♪the SkyCoord クラスには典型的な分析に有用な便利な手法が多い.

  • 現在のところ SkyCoord 対象者は astropy.coordinates.frame_transform_graph 図形オブジェクトを変換する.

SkyCoordオブジェクトの作成

♪the SkyCoord クラスは初期化のための様々な入力を受け付ける.少なくとも、これらの座標は、明確な単位を有する1つまたは複数の天座標値を提供しなければならない。これは必要ではないにもかかわらず、一般的に座標系を指定しなければならない。

よく見られるパターンを以下に示す.本説明では,大文字の値を以下に示す COORD あるいは…。 FRAME 入力を表していますこれらの入力は Initialization Syntax 一節です。四角括弧の要素は [unit=UNIT] オプションです。**

SkyCoord(COORD, [FRAME], keyword_args ...)
SkyCoord(LON, LAT, [frame=FRAME], [unit=UNIT], keyword_args ...)
SkyCoord([FRAME], <lon_attr>=LON, <lat_attr>=LAT, keyword_args ...)

以下の例は初期化を説明する. SkyCoord 相手。これらは,球面座標を用いて初期化を行うことを反映しており,これはすべての内蔵フレームのデフォルト設定である.異なる表現(例えばデカルトや円柱)の使用方法を理解するためには、前節を参照してください Representations それがそうです。まずいくつかの輸入:

>>> from astropy.coordinates import SkyCoord  # High-level coordinates
>>> from astropy.coordinates import ICRS, Galactic, FK4, FK5  # Low-level frames
>>> from astropy.coordinates import Angle, Latitude, Longitude  # Angles
>>> import astropy.units as u
>>> import numpy as np

実例.

位置パラメータとキーワードパラメータを用いて座標値とフレームワーク仕様を提供することができる.まず,RAとDECの位置パラメータを示す:

>>> SkyCoord(10, 20, unit='deg')  # Defaults to ICRS  
<SkyCoord (ICRS): (ra, dec) in deg
    (10., 20.)>

>>> SkyCoord([1, 2, 3], [-30, 45, 8], frame='icrs', unit='deg')  
<SkyCoord (ICRS): (ra, dec) in deg
    [(1., -30.), (2., 45.), (3.,   8.)]>

上の最初の例はフレームワークが明示的に与えられていないことに留意されたい。この場合、デフォルトはICRSシステムである(“J 2000”赤道座標に対してほぼ正しい)。しかしながら、ICRとして知られている場合、コードを読む人は誰でもその意図をよりよく理解することができるので、フレームを明示的に指定することは常により良い方法である。

一般的なフォーマットの文字列入力は受け入れ可能であり、フレームワークはクラスタイプとして提供することができる FK4 Frameクラスの例です SkyCoord インスタンス(そこからフレームを抽出する)、またはフレーム名の小文字バージョンを文字列、例えば、 "fk4" **

>>> coords = ["1:12:43.2 +1:12:43", "1 12 43.2 +1 12 43"]
>>> sc = SkyCoord(coords, frame=FK4, unit=(u.hourangle, u.deg), obstime="J1992.21")
>>> sc = SkyCoord(coords, frame=FK4(obstime="J1992.21"), unit=(u.hourangle, u.deg))
>>> sc = SkyCoord(coords, frame='fk4', unit='hourangle,deg', obstime="J1992.21")

>>> sc = SkyCoord("1h12m43.2s", "+1d12m43s", frame=Galactic)  # Units from strings
>>> sc = SkyCoord("1h12m43.2s +1d12m43s", frame=Galactic)  # Units from string
>>> sc = SkyCoord(l="1h12m43.2s", b="+1d12m43s", frame='galactic')
>>> sc = SkyCoord("1h12.72m +1d12.71m", frame='galactic')

データと SkyCoord インスタンスはフレームとしてしか使用できない frame= キーワードパラメータは、位置パラメータではない。

上に持つ ra そして dec 属性は、他の多くの一般的なフォーマットの座標文字列を提供することができます。例は以下のとおりである.

>>> sc = SkyCoord("15h17+89d15")
>>> sc = SkyCoord("275d11m15.6954s+17d59m59.876s")
>>> sc = SkyCoord("8 00 -5 00.6", unit=(u.hour, u.deg))
>>> sc = SkyCoord("J080000.00-050036.00", unit=(u.hour, u.deg))
>>> sc = SkyCoord("J1874221.31+122328.03", unit=u.deg)

Astropy Quantity -タイプオブジェクトを入力形式として受け入れることができ、奨励することができる:

>>> ra = Longitude([1, 2, 3], unit=u.deg)  # Could also use Angle
>>> dec = np.array([4.5, 5.2, 6.3]) * u.deg  # Astropy Quantity
>>> sc = SkyCoord(ra, dec, frame='icrs')
>>> sc = SkyCoord(ra=ra, dec=dec, frame=ICRS, obstime='2001-01-02T12:34:56')

最後に,下位座標フレームオブジェクトから初期化することができる.

>>> c = FK4(1 * u.deg, 2 * u.deg)
>>> sc = SkyCoord(c, obstime='J2010.11', equinox='B1965')  # Override defaults

ここで強調表示される重要なポイントの1つは、低レベルのオブジェクトが作成されると、いくつかのデフォルト属性値を有することである。例えば FK4 枠組み用途. equinox='B1950.0 そして obstime=equinox デフォルト値とします。このオブジェクトが初期化に使用される場合 SkyCoord 明示的に設定されていない下位オブジェクト属性をカバーすることができます。上の座標が作成されていれば c = FK4(1 * u.deg, 2 * u.deg, equinox='B1960') そして作成したのは SkyCoord 様々な方法で equinox 例外を引き起こすことになります

初期化文法

球面表現(これは最も一般的であり、すべての内蔵フレームのデフォルト入力フォーマットでもある)、 SkyCoord 詳細は以下のとおりである.

SkyCoord(COORD, [FRAME | frame=FRAME], [unit=UNIT], keyword_args ...)
SkyCoord(LON, LAT, [DISTANCE], [FRAME | frame=FRAME], [unit=UNIT], keyword_args ...)
SkyCoord([FRAME | frame=FRAME], <lon_name>=LON, <lat_name>=LAT, [unit=UNIT],
         keyword_args ...)

上記の説明では、全ての大文字の要素(例えば、 FRAME )要素タイプを記述するユーザ入力。方形括弧内の要素は任意である。非球形入力については、ご参照ください Representations 一節です。

LON, LAT

経糸値および緯値は、別個の位置パラメータとして指定することができる。以下のオプションを使用して、経度および緯度:

  • 単角値:

    • Quantity 客体.

    • 純粋なデジタル値、帯 unit 単位のキーワードを指定する

    • フォーマット化された角度文字列 創作Longitude あるいは…。 Latitude 対象者.

  • リストや Quantity 角度値の配列またはNumPy配列

  • Angle, Longitude, or Latitude object, which can be scalar or array-valued

注釈

そして当を受ける. SkyCoord 経度および緯度コンポーネントの指定には柔軟であり,Frame類は受信を期待している. Quantity −角度単位を有する類似オブジェクト(すなわち、 Angle あるいは…。 Quantity )である。例えば、コンポーネントが指定された場合、フレームカテゴリ(例えば、 ICRS )を作成する必要があります

>>> ICRS(0 * u.deg, 0 * u.deg) 
<ICRS Coordinate: (ra, dec) in deg
    (0., 0.)>

他の柔軟な初期化方法(使用 SkyCoord )は機能しません

>>> ICRS(0, 0, unit=u.deg) 
UnitTypeError: Longitude instances require units equivalent to 'rad', but no unit was given.

DISTANCE

フレームの中心からオブジェクトまでの距離を指定することができる:

  • 単一の距離値:

    • Quantity あるいは…。 Distance 客体.

    • 無量綱距離の一般的な数値

    • 純粋なデジタル値、帯 unit 単位のキーワードを指定する

  • リスト、または Quantity あるいは、あるいは Distance 角度値の配列またはNumPy配列

COORD

この入力フォームは,単一のオブジェクトを用いて座標データを提供する.球形座標フレームの場合、座標は、以下の1つまたは複数の緯度経度対を含むことができる。

  • LONとLAT値の単一の座標文字列をスペースで区切る.各値は、フォーマット化された任意の文字列であってもよい 創作Longitude あるいは…。 Latitude 相手。

  • このような座標文字列のリストまたはNumPy配列.

  • (LON,LAT)タプルリストであり、各LONおよびLATは、スカラ(配列ではない)である。

  • N x 2 NumPyまたは Quantity 値の配列であり、第1の列は経度であり、第2の列は緯度であり、例えば、 [[270, -30], [355, +85]] * u.deg それがそうです。

  • (LON、LAT、DISTANCE)タプルリスト。

  • N x 3 NumPyまたは Quantity 列はそれぞれ経度,緯度,距離の値配列である.

入力は、必ずしも標準球面座標で表されないより一般的なオブジェクトであってもよい。

FRAME

This can be a BaseCoordinateFrame frame class, an instance of such a class, or the corresponding string alias. The frame classes that are built in to Astropy are ICRS, FK5, FK4, FK4NoETerms, Galactic, and AltAz. The string aliases are lowercase versions of the class name.

フレームワークが提供されていない場合、特別なものが見られます ICRS 識別子です。これは,このフレームが指定されておらず,座標を比較する操作が許されていないことを示している(そのオブジェクト内であっても).

unit=UNIT

単位説明子は、以下の1つであってもよい。

  • Unit 物体は角度単位であり Unit('radian') それがそうです。

  • 有効角度単位名を有する単一の文字列。

  • 2元グループの Unit LONおよびLATユニットのオブジェクトまたは文字列ユニット名(例えば、 ('hourangle', 'degree') )。

  • コンマで区切られた2つのユニット名を有する単一の文字列(例えば、 'hourangle,degree' )。

単一のデバイスのみが提供される場合、LONおよびLATに同時に適用される。

その他のキーワードパラメータ

位置パラメータを使用して経度および緯度を指定するのではなく、フレーム固有の名前をキーワードパラメータとして使用することができる。

ra, dec: LON, LAT values, optional

RA and Dec for frames where these are representation, including [FIXME] ICRS, FK5, FK4, and FK4NoETerms.

l, b: LON, LAT values, optional

銀河.銀河 l そして b 上の Galactic フレームワーク。

以下のキーワードは、任意のフレームに指定することができる。

距離 :有効 Distance 初期値設定項、オプション

参考中心から震源までの距離

昏睡時間. :有効 Time 初期値設定項、オプション

時間を観察する

春分. :有効 Time 初期値設定項、オプション

座標フレーム分点

ユーザ定義フレームが変換マップに含まれ、追加のフレーム属性を有する場合、これらの属性は、対応するキーワードパラメータによって設定されてもよい。 SkyCoord 初期化します。

アレイ操作.

座標配列を格納することができます SkyCoord オブジェクトであり、このようにして行われる操作は、個人リストをループトラバースするよりも数桁速い。 SkyCoord 物体です。

実例.

座標配列を格納する SkyCoord 対象::

>>> ra = np.linspace(0, 36000, 1001) * u.deg
>>> dec = np.linspace(-90, 90, 1001) * u.deg

>>> sc_list = [SkyCoord(r, d, frame='icrs') for r, d in zip(ra, dec)]  
>>> timeit sc_gal_list = [c.galactic for c in sc_list]  
1 loops, best of 3: 20.4 s per loop

>>> sc = SkyCoord(ra, dec, frame='icrs')
>>> timeit sc_gal = sc.galactic  
100 loops, best of 3: 21.8 ms per loop

ベクトル化変換に加えて、同じ方法および属性を使用して、一般的な配列スライス、分割、および選択を実行することができます。 ndarray 実例です。同様に、On numpy バージョン1.17以降、対応する機能、および形状に影響を与える他の機能、例えば atleast_1d そして rollaxis 期待通りに仕事をします。(関連する機能は明示的に有効にされなければならない astropy ソースコードが numpy 動作すべき関数はサポートされていないと思います):::

.. doctest-requires:: numpy>=1.17
>>> north_mask = sc.dec > 0
>>> sc_north = sc[north_mask]
>>> len(sc_north)
500
>>> sc[2:4]  
<SkyCoord (ICRS): (ra, dec) in deg
    [( 72., -89.64), (108., -89.46)]>
>>> sc[500]
<SkyCoord (ICRS): (ra, dec) in deg
    (0., 0.)>
>>> sc[0:-1:100].reshape(2, 5)
<SkyCoord (ICRS): (ra, dec) in deg
    [[(0., -90.), (0., -72.), (0., -54.), (0., -36.), (0., -18.)],
     [(0.,   0.), (0.,  18.), (0.,  36.), (0.,  54.), (0.,  72.)]]>
>>> np.roll(sc[::100], 1)
<SkyCoord (ICRS): (ra, dec) in deg
    [(0.,  90.), (0., -90.), (0., -72.), (0., -54.), (0., -36.),
     (0., -18.), (0.,   0.), (0.,  18.), (0.,  36.), (0.,  54.),
     (0.,  72.)]>

注意してください ndarray 方法は、 flatten 新しいデータビューを使用しようとすると、不可能な場合にのみデータをコピーすることができる(例えば、NumPy文書で議論されているように reshape() )。

在位修正座標オブジェクト

配列値における座標値 SkyCoord 対象をその場で修正することができる(Asterpy 4.1に加える).これは別のものから新しい値を設定する必要があります SkyCoord オブジェクトは,そのオブジェクトは実座標データ値を除くすべての点で等価である.このように、フレーム変換を必要とせず、プロジェクト設定動作は非常にロバストである。

具体的には、右手 value 修正対象と厳密に一致しなければならない:

  • まったく同じクラス

  • 等価フレームワーク (is_equivalent_frame

  • 同じ表示タイプ(_TYPE)

  • 同じ表現法はキーワードを区別することができる

  • 同じフレーム属性

  • 同じ“追加”フレーム属性(例えば、 obstime ICRS座標について)

中の座標配列を修正する SkyCoord 対象Numpy配列に対して同じ文法を用いる:

>>> sc1 = SkyCoord([1, 2] * u.deg, [3, 4] * u.deg)
>>> sc2 = SkyCoord(10 * u.deg, 20 * u.deg)
>>> sc1[0] = sc2
>>> sc1
<SkyCoord (ICRS): (ra, dec) in deg
    [(10., 20.), ( 2.,  4.)]>

スカラーまたは配列値を挿入することができます SkyCoord オブジェクトを別の互換性のあるものに追加する SkyCoord 対象::

>>> sc1 = SkyCoord([1, 2] * u.deg, [3, 4] * u.deg)
>>> sc2 = SkyCoord(10 * u.deg, 20 * u.deg)
>>> sc1.insert(1, sc2)
<SkyCoord (ICRS): (ra, dec) in deg
    [( 1.,  3.), (10., 20.), ( 2.,  4.)]>

修正できる SkyCoord 対象在位時、すべて 表操作 例えば接続、スタック、挿入 SkyCoord 混合列(マスクが必要ない限り)。

これらの方法は比較的遅いですなぜなら既存の SkyCoord オブジェクトは,操作が有効であることを確保するために広範な検証を行う.いくつかのアプリケーションの場合、部分的に説明したように、異なるより低いレベルの方法をとる必要がある場合がある 座標の高速定位置修正 それがそうです。

警告

座標オブジェクトをその場で修正するために、例えば、コンポーネント属性を直接更新するなど、明らかな方法を試みることができるかもしれません。 sc1.ra[1] = 40 * u.deg それがそうです。しかしこれは 現れる 正しい結果を与えるために,実際には下位表現データを修正しない.これは,現在実現されている性能ベースのキャッシュに関連している.現在のキャッシュ実現でも,表示の定位置変更を扱うことはできない. (.data )やフレーム属性など .obstime それがそうです。

属性

♪the SkyCoord 対象には有用な属性が多く,これらの属性は非常に有用である.これらの内容を深く研究することで、私たちはいくつかのことを理解します SkyCoord どうやって働いているのかということです

まず,対象属性や手法を学習する最も重要なツールの1つは“TAB-Discovery”である.IPythonでは、オブジェクト名、句読点を入力し、<TAB>キーを押して利用可能なコンテンツを表示することができます。これは通常文書を読むよりも速いです

>>> sc = SkyCoord(1, 2, frame='icrs', unit='deg', obstime='2013-01-02 14:25:36')
>>> sc.<TAB>  
sc.T                                   sc.match_to_catalog_3d
sc.altaz                               sc.match_to_catalog_sky
sc.barycentrictrueecliptic             sc.name
sc.cartesian                           sc.ndim
sc.cirs                                sc.obsgeoloc
sc.copy                                sc.obsgeovel
sc.data                                sc.obstime
sc.dec                                 sc.obswl
sc.default_representation              sc.position_angle
sc.diagonal                            sc.precessedgeocentric
sc.distance                            sc.pressure
sc.equinox                             sc.ra
sc.fk4                                 sc.ravel
sc.fk4noeterms                         sc.realize_frame
sc.fk5                                 sc.relative_humidity
sc.flatten                             sc.represent_as
sc.frame                               sc.representation_component_names
sc.frame_attributes                    sc.representation_component_units
sc.frame_specific_representation_info  sc.representation_info
sc.from_name                           sc.reshape
sc.from_pixel                          sc.roll
sc.galactic                            sc.search_around_3d
sc.galactocentric                      sc.search_around_sky
sc.galcen_distance                     sc.separation
sc.gcrs                                sc.separation_3d
sc.geocentrictrueecliptic              sc.shape
sc.get_constellation                   sc.size
sc.get_frame_attr_names                sc.skyoffset_frame
sc.guess_from_table                    sc.spherical
sc.has_data                            sc.spherical_offsets_to
sc.hcrs                                sc.squeeze
sc.heliocentrictrueecliptic            sc.supergalactic
sc.icrs                                sc.swapaxes
sc.info                                sc.take
sc.is_equivalent_frame                 sc.temperature
sc.is_frame_attr_default               sc.to_pixel
sc.is_transformable_to                 sc.to_string
sc.isscalar                            sc.transform_to
sc.itrs                                sc.transpose
sc.location                            sc.z_sun

ここで、私たちは多くの属性と方法を見ることができる。最も識別しやすいのは経度と緯度属性かもしれません ra そして dec 上の ICRS フレームワーク::

>>> sc.ra  
<Longitude 1. deg>
>>> sc.dec  
<Latitude 2. deg>

Next, notice that all of the built-in frame names icrs, galactic, fk5, fk4, and fk4noeterms are there. Through the magic of Python properties, accessing these attributes calls the object transform_to method appropriately and returns a new SkyCoord object in the requested frame:

>>> sc_gal = sc.galactic
>>> sc_gal  
<SkyCoord (Galactic): (l, b) in deg
    (99.63785528, -58.70969293)>

Other attributes you may recognize are distance, equinox, obstime, and shape.

深く掘り下げる.

[[臨時ユーザはこの部分をスキップすることができる]]

Galaxyに変換した後、現在、経糸値と緯糸値をマーキングします l そして b 銀河系座標の一般的な慣例に従っています相手はどうやってその値を呼ぶか知っていますか?答えはあまり明らかではない属性です

>>> sc_gal.representation_component_names
{'l': 'lon', 'b': 'lat', 'distance': 'distance'}

>>> sc_gal.representation_component_units
{'l': Unit("deg"), 'b': Unit("deg")}

>>> sc_gal.representation_type
<class 'astropy.coordinates.representation.SphericalRepresentation'>

これらを加えて相手に教えます l そして b 経度および緯度であり、いずれも度単位で球面座標(デカルト座標ではなく)として表示されるべきである。さらにフレームワークの representation_component_names 属性は、座標キーワードパラメータを定義し、このパラメータ SkyCoord すべて受け入れます。

もう一つの重要な属性は frame_attr_names これは,フレームワークを完全に定義するために必要な他の属性を定義する:

>>> sc_fk4 = SkyCoord(1, 2, frame='fk4', unit='deg')
>>> sc_fk4.get_frame_attr_names()
{'equinox': <Time object: scale='tt' format='byear_str' value=B1950.000>, 'obstime': None}

ユーザが明示的な値を提供していない場合、キー値はデフォルト値に対応する。この例は FK4 フレームは2つの属性を持っています equinox そして obstime これは、フレームを完全に定義するために必要である。

ここではいくつかのトリックが発生していますこれらの属性の多くは実際には基礎座標に属しているからです frame 対象者は実際の仕事の大部分を完成させる.これは対象とする三層システムにおける中間層:(球面,デカルトなど),フレーム(とも呼ばれる)を表す.低レベルのフレームワーク)と SkyCoord (別名a.高級類を参照されたい 概要 astropy.coordinates 概念 そして 重要な定義 ):

>>> sc.frame  
<ICRS Coordinate: (ra, dec) in deg
    (1., 2.)>

>>> sc.has_data is sc.frame.has_data
True

>>> sc.frame.<TAB>  
sc.frame.T                                   sc.frame.ra
sc.frame.cartesian                           sc.frame.ravel
sc.frame.copy                                sc.frame.realize_frame
sc.frame.data                                sc.frame.represent_as
sc.frame.dec                                 sc.frame.representation
sc.frame.default_representation              sc.frame.representation_component_names
sc.frame.diagonal                            sc.frame.representation_component_units
sc.frame.distance                            sc.frame.representation_info
sc.frame.flatten                             sc.frame.reshape
sc.frame.frame_attributes                    sc.frame.separation
sc.frame.frame_specific_representation_info  sc.frame.separation_3d
sc.frame.get_frame_attr_names                sc.frame.shape
sc.frame.has_data                            sc.frame.size
sc.frame.is_equivalent_frame                 sc.frame.spherical
sc.frame.is_frame_attr_default               sc.frame.squeeze
sc.frame.is_transformable_to                 sc.frame.swapaxes
sc.frame.isscalar                            sc.frame.take
sc.frame.name                                sc.frame.transform_to
sc.frame.ndim                                sc.frame.transpose

>>> sc.frame.name
'icrs'

♪the SkyCoord 対象が公開される frame 対象属性は自分の属性とする.一見困惑しているように見えるかもしれませんが、これは良いことです SkyCoord 相手と BaseCoordinateFrame 対象の行動は非常に類似しており,多くのルーチンは入力の1つを難なく受け取ることができる(アヒルがタイプした!)

スタックの中で最も低い層は抽象です UnitSphericalRepresentation 目標:

>>> sc_gal.frame.data  
<UnitSphericalRepresentation (lon, lat) in rad
    (1.73900863, -1.02467744)>

変換する.

前節では変換のテーマを詳しく紹介した。 システム間の変換 それがそうです。

完全のために、ここでいくつかの例を挙げます。座標および参照フレームが定義されると、フレームから別のフレームに変換することができる。これをいくつかの異なる方法で実現することができます:フレームワークのデフォルトバージョンのみが必要な場合、属性パターンアクセス(前述した)を使用することができます。より多くの制御を得るためには transform_to 方法では、この方法は、Frame名、Frameクラス、Frameインスタンス、またはFrameインスタンスを受け入れる SkyCoord それがそうです。

実例.

1つのフレームから別のフレームに変換するには、以下の動作を実行してください。

>>> from astropy.coordinates import FK5
>>> sc = SkyCoord(1, 2, frame='icrs', unit='deg')
>>> sc.galactic  
<SkyCoord (Galactic): (l, b) in deg
    (99.63785528, -58.70969293)>

>>> sc.transform_to('fk5')  # Same as sc.fk5 and sc.transform_to(FK5)  
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
        (1.00000656, 2.00000243)>

>>> sc.transform_to(FK5(equinox='J1975'))  # Transform to FK5 with a different equinox  
<SkyCoord (FK5: equinox=J1975.000): (ra, dec) in deg
        (0.67967282, 1.86083014)>

変化しています SkyCoord 例は、2つの座標が完全に同じ基準系列に位置することを保証する便利な方法である。

>>> sc2 = SkyCoord(3, 4, frame='fk4', unit='deg', obstime='J1978.123', equinox='B1960.0')
>>> sc.transform_to(sc2)  
<SkyCoord (FK4: equinox=B1960.000, obstime=J1978.123): (ra, dec) in deg
    (0.48726331, 1.77731617)>

表示法

これまで,我々はすべての例で球面座標表現を用いてきたが,これは内蔵フレームのデフォルト設定である.一般に、座標を初期化または使用するためには、異なる表現(例えば、デカルト表現またはシリンドリカル表現)を使用することが便利である。本節では,異なる表示形式を用いてオブジェクトを初期化する方法と,オブジェクトの表示形式をどのように変更するかについて議論する.製図表現対象自体の詳細については、ご参照ください 使用と設計座標表現法 それがそうです。

初期化

あなたが知るべき内容の大部分は次の例から推定することができ,前の球面表示文書を推定することで推定することもできる.初期化には設定が必要です representation_type キーワードは、その表現に対応するコンポーネントを提供する。

実例.

球形以外の表示タイプ初期化オブジェクトを使用するには、以下の操作を実行してください。

>>> c = SkyCoord(x=1, y=2, z=3, unit='kpc', representation_type='cartesian')
>>> c  
<SkyCoord (ICRS): (x, y, z) in kpc
    (1., 2., 3.)>
>>> c.x, c.y, c.z  
(<Quantity 1. kpc>, <Quantity 2. kpc>, <Quantity 3. kpc>)

他の変異体には

>>> SkyCoord(1, 2*u.deg, 3, representation_type='cylindrical')  
<SkyCoord (ICRS): (rho, phi, z) in (, deg, )
    (1., 2., 3.)>

>>> SkyCoord(rho=1*u.km, phi=2*u.deg, z=3*u.m, representation_type='cylindrical')  
<SkyCoord (ICRS): (rho, phi, z) in (km, deg, m)
    (1., 2., 3.)>

>>> SkyCoord(rho=1, phi=2, z=3, unit=(u.km, u.deg, u.m), representation_type='cylindrical')  
<SkyCoord (ICRS): (rho, phi, z) in (km, deg, m)
    (1., 2., 3.)>

>>> SkyCoord(1, 2, 3, unit=(None, u.deg, None), representation_type='cylindrical')  
<SkyCoord (ICRS): (rho, phi, z) in (, deg, )
    (1., 2., 3.)>

一般に,許容される文法は以下のとおりである.

SkyCoord(COORD, [FRAME | frame=FRAME], [unit=UNIT], [representation_type=REPRESENTATION],
         keyword_args ...)
SkyCoord(COMP1, COMP2, [COMP3], [FRAME | frame=FRAME], [unit=UNIT],
         [representation_type=REPRESENTATION], keyword_args ...)
SkyCoord([FRAME | frame=FRAME], <comp1_name>=COMP1, <comp2_name>=COMP2,
         <comp3_name>=COMP3, [representation_type=REPRESENTATION], [unit=UNIT],
         keyword_args ...)

この場合には keyword_args 今は要素が含まれています representation_type=REPRESENTATION それがそうです。上記の説明では、全ての大文字の要素(例えば、 FRAME )要素タイプを記述するユーザ入力。方形括弧内の要素は任意である。

COMP1, COMP2, COMP3

コンポーネント値は、別個の位置パラメータまたはキーワードパラメータとして指定することができる。このような形式では、入力を許可する適切なタイプは、表現の詳細に依存する。一般に,以下の入力フォームをサポートする.

  • 単値:

    • コンポーネント類オブジェクト

    • 純粋なデジタル値、帯 unit 単位のキーワードを指定する

  • リストまたはコンポーネントクラス配列、またはNumPy値配列

各表示コンポーネントは、汎用入力データを特定の単位を有する所定のオブジェクトクラスに変換するための指定されたクラス(“コンポーネントクラス”)を有する。これらのコンポーネント類は Quantity 級友たち。

COORD

この入力フォームは,単一のオブジェクトを用いて座標データを提供する.座標は、以下に示すように、1つまたは複数の座標位置を指定することができる。

  • 明細書 (COMP1, .., COMP<M>) タプルは、各コンポーネントがスカラ(配列ではない)であり、あります。 M 表現中の部品です。通常は3つの構成要素がありますがいくつかは(例えば UnitSphericalRepresentation )をより少なく持つことができる。

  • N x M NumPyまたは Quantity 値配列、その中で N 座標の数であり M コンポーネントの数です。

REPRESENTATION

表示形式は BaseRepresentation クラス(例えば、 CartesianRepresentation )または文字列名としては、単に小文字の類名であり、持たない 'representation' 接尾辞(例えば、 'cartesian' )。

作成に使われています SkyCoord 一般にオブジェクトは球形オブジェクトと同じである.

細かい点

利用可能な表示セットは動的であり,定義された表示クラスによって変化する可能性がある.内蔵表示法には:

名前.名前.

クラス

spherical

SphericalRepresentation

unitspherical

UnitSphericalRepresentation

physicsspherical

PhysicsSphericalRepresentation

cartesian

CartesianRepresentation

cylindrical

CylindricalRepresentation

各フレームは、すべての利用可能な表現を知っているが、異なるフレームは、同じ構成要素に対して異なる名前を使用することができる。一般的な例は Galactic 枠組み用途. l そして b ではなく ra そして dec 上の lon そして lat のコンポーネントです。 SphericalRepresentation それがそうです。

特定のフレームの場合、表現された完全リストおよびそれがどのようにすべての構成要素を命名するかを見るために、まず、データなしにフレームのインスタンスを作成し、その後、印刷する。 representation_info 物件::

>>> ICRS().representation_info  
{astropy.coordinates.representation.CartesianRepresentation:
  {'names': ('x', 'y', 'z'),
   'units': (None, None, None)},
 astropy.coordinates.representation.SphericalRepresentation:
  {'names': ('ra', 'dec', 'distance'),
   'units': (Unit("deg"), Unit("deg"), None)},
 astropy.coordinates.representation.UnitSphericalRepresentation:
  {'names': ('ra', 'dec'),
   'units': (Unit("deg"), Unit("deg"))},
 astropy.coordinates.representation.PhysicsSphericalRepresentation:
  {'names': ('phi', 'theta', 'r'),
   'units': (Unit("deg"), Unit("deg"), None)},
 astropy.coordinates.representation.CylindricalRepresentation:
  {'names': ('rho', 'phi', 'z'),
   'units': (None, Unit("deg"), None)}
}

これは少し混乱していますがそれぞれの表現には dict 鍵が二つあった。

  • names :各コンポーネントをこのフレームワークにどのように名前付けするかを定義する.

  • units :出力時の各コンポーネントの単位を定義し,その中で None ある特定の単位を強制しないことを意味する。

特定の座標例については、使用することができる representation_type 属性と representation_component_names 属性は,特定のクラスオブジェクトがどのキーワードを受け取るかを決定する.前者は、システムの表示クラス(例えば、赤道フレームに対して球形)を表し、後者は、そのフレームの名前をクラス上のコンポーネント名を表す辞書にマッピングする。

>>> import astropy.units as u
>>> icrs = ICRS(1*u.deg, 2*u.deg)
>>> icrs.representation_type
<class 'astropy.coordinates.representation.SphericalRepresentation'>
>>> icrs.representation_component_names
{'ra': 'lon', 'dec': 'lat', 'distance': 'distance'}

変更表示法

座標オブジェクトの表示形式を変更することができ,以下のようになる.これは実際には 何でもない 座標値を格納するオブジェクト内部データであるが、2つの方法でデータの外部ビューを変更する。

  • このオブジェクトは,新たな表示法によりそれ自身を印刷する.

  • 利用可能な属性は、新しい表現の属性に一致するように変更される(例えば、 ra, dec, distance 至る x, y, z )。

設ける representation_type そこで変わったのは 財産性. 3 D空間における点を表す固有オブジェクト自体を変更することなく、オブジェクト(その外観)を修正する。

実例.

属性は座標オブジェクトの表示形式を変更する representation_type **

>>> c = SkyCoord(x=1, y=2, z=3, unit='kpc', representation_type='cartesian')
>>> c  
<SkyCoord (ICRS): (x, y, z) in kpc
    (1., 2., 3.)>

>>> c.representation_type = 'cylindrical'
>>> c  
<SkyCoord (ICRS): (rho, phi, z) in (kpc, deg, kpc)
    (2.23606798, 63.43494882, 3.)>
>>> c.phi.to(u.deg)  
<Angle 63.43494882 deg>
>>> c.x
Traceback (most recent call last):
...
AttributeError: 'SkyCoord' object has no attribute 'x'

>>> c.representation_type = 'spherical'
>>> c  
<SkyCoord (ICRS): (ra, dec, distance) in (deg, deg, kpc)
    (63.43494882, 53.3007748, 3.74165739)>

>>> c.representation_type = 'unitspherical'
>>> c  
<SkyCoord (ICRS): (ra, dec) in deg
    (63.43494882, 53.3007748)>

表示を設定するために任意の表示クラスを使用することもできます:

>>> from astropy.coordinates import CartesianRepresentation
>>> c.representation_type = CartesianRepresentation

変更することなく、特定の表示形式だけが必要であれば注意してください SkyCoord 対象は変更すべきである astropy.coordinates.SkyCoord.represent_as() 方法:

>>> c.representation_type = 'spherical'
>>> cart = c.represent_as(CartesianRepresentation)
>>> cart  
<CartesianRepresentation (x, y, z) in kpc
    (1., 2., 3.)>
>>> c.representation_type
<class 'astropy.coordinates.representation.SphericalRepresentation'>

例1:Aitoff投影におけるランダムデータの描画

これはAitoff投影におけるデータを用いてAitoff投影に描画を描画する方法の一例である. SkyCoord 相手。ここでは,ランダムに生成したデータセットを用いる.

まず、私たちは必要なカバンを導入する必要がある。私たちは matplotlib ここで共謀して numpy πの値を得てランダムなデータを生成する.

>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> import numpy as np

我々は現在可視化のためのランダムデータを生成する.RAでは、0から360度の範囲で完成しています (ra_random )、DECは-90度から+90度 (dec_random )である。最後にこれらの値を度数で掛け合わせて Quantity 度単位で。

>>> ra_random = np.random.rand(100)*360.0 * u.degree
>>> dec_random = (np.random.rand(100)*180.0-90.0) * u.degree

As the next step, those coordinates are transformed into an astropy.coordinates SkyCoord object.

>>> c = SkyCoord(ra=ra_random, dec=dec_random, frame='icrs')

Matplotlibはアークとアークの間の座標を必要とするからである \(-\pi\) そして \(\pi\) 0とではなく \(2\pi\) 私たちは彼らの考えを変えなければならない。そのためには astropy.coordinates.Angle オブジェクトは、ここで180を包装するために使用される特別な方法を提供する。

>>> ra_rad = c.ra.wrap_at(180 * u.deg).radian
>>> dec_rad = c.dec.radian

最後のステップとして,matplotlibを用いて描画環境を設定し,特定のタイトル,メッシュ,充填円をマーカとして持つAitoff投影を用い,マーカサイズは2,Alpha値は0.3とした.我々が用いた図形のx-y比はこのような投影に非常に適しており,軸ラベルと重ならないように見出しを通常の位置から上方に移動させる.

>>> import matplotlib.pyplot as plt
>>> plt.figure(figsize=(8,4.2))
>>> plt.subplot(111, projection="aitoff")
>>> plt.title("Aitoff projection of our random data")
>>> plt.grid(True)
>>> plt.plot(ra_rad, dec_rad, 'o', markersize=2, alpha=0.3)
>>> plt.subplots_adjust(top=0.95,bottom=0.0)
>>> plt.show()

(png, svg, pdf)

../_images/skycoord-1.png

例2:突起と円盤に恒星位置を描画する

これはAitoff投影におけるデータを使用してAitoff投影において描画を描画する方法を示すより現実的な例である SkyCoord 相手。ここでは、銀河突起とディスク内の2つの恒星にランダムに生成されたデータセット(多元正規分布)を用いる。この2種類の描画は、異なる数字カウントを使用する。

前の例と同様に,まず必要なパケットを導入する.

>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord
>>> import numpy as np

現在,以下のツールを用いて可視化のためのランダムデータを生成する. numpy.random.Generator.multivariate_normal それがそうです。

>>> disk = np.random.multivariate_normal(mean=[0,0,0], cov=np.diag([1,1,0.5]), size=5000)
>>> bulge = np.random.multivariate_normal(mean=[0,0,0], cov=np.diag([1,1,1]), size=500)
>>> galaxy = np.concatenate([disk, bulge])

As the next step, those coordinates are transformed into an astropy.coordinates SkyCoord object.

>>> c_gal = SkyCoord(galaxy, representation_type='cartesian', frame='galactic')
>>> c_gal_icrs = c_gal.icrs

同様に、前の例と同様に、座標をアークに変換し、それらがあることを確認する必要があります \(-\pi\) そして \(\pi\)

>>> ra_rad = c_gal_icrs.ra.wrap_at(180 * u.deg).radian
>>> dec_rad = c_gal_icrs.dec.radian

前の例と同様の印刷設定を使用します。

>>> import matplotlib.pyplot as plt
>>> plt.figure(figsize=(8,4.2))
>>> plt.subplot(111, projection="aitoff")
>>> plt.title("Aitoff projection of our random data")
>>> plt.grid(True)
>>> plt.plot(ra_rad, dec_rad, 'o', markersize=2, alpha=0.3)
>>> plt.subplots_adjust(top=0.95,bottom=0.0)
>>> plt.show()

(png, svg, pdf)

../_images/skycoord-2.png

SkyCoord対象を比較する

2つの主な比較方法があります SkyCoord 対象間の関係。まず,座標が互いに指定された距離内にあるかどうかを調べることである.これは,浮動小数点表現問題による許容差を許すため,多くのユーザが彼らの科学的あるいは処理分析作業で行うべきことである.2つ目は2つの対象の正確な等価性を検査することであり,これはテストを作成する開発者に最も有用である.

以下の例は、往復変換FK 4=>ICRS=>FK 4を実行し、比較を行う精密等価比較を用いた浮動小数点問題を示す。

>>> sc1 = SkyCoord(1*u.deg, 2*u.deg, frame='fk4')
>>> sc1.icrs.fk4 == sc1
False

公差内に一致する.

座標がお互いのある角度距離内にあるかどうかをテストする場合は、ご利用ください separation 方法:

>>> sc1.icrs.fk4.separation(sc1).to(u.arcsec)  
<Angle 7.98873629e-13 arcsec>
>>> sc1.icrs.fk4.separation(sc1) < 1e-9 * u.arcsec
True

まったく等しい.

Astropyはまた座標の精密な等価演算子を提供する.例えば、例えば2つを比較すると SkyCoord 対象::

>>> left_skycoord == right_skycoord  

右オブジェクトは左オブジェクトと厳密に一致しなければ比較できない:

  • まったく同じクラス

  • 等価フレームワーク (is_equivalent_frame

  • 同じ表示タイプ(_TYPE)

  • 同じ表現法はキーワードを区別することができる

  • 同じフレーム属性

  • 同じ“追加”フレーム属性(例えば、 obstime ICRS座標について)

第1の例では、配列値座標を用いて簡単な比較を行う。

>>> sc1 = SkyCoord([1, 2]*u.deg, [3, 4]*u.deg)
>>> sc2 = SkyCoord([1, 20]*u.deg, [3, 4]*u.deg)

>>> sc1 == sc2  # Array-valued comparison
array([ True, False])
>>> sc2 == sc2[1]  # Broadcasting comparison with a scalar
array([False,  True])
>>> sc2[0] == sc2[1]  # Scalar to scalar comparison
False
>>> sc1 != sc2  # Not equal
array([False,  True])

等しい比較には,成分データ(速度を含むことができる)を表すデータを数値的に比較するほか,すべてのフレーム属性が類似している厳密なテストも含まれる. equinox あるいは…。 obstime 全く同じです。属性のいずれの不一致も例外を引き起こす.例えば:

>>> sc1 = SkyCoord([1, 2]*u.deg, [3, 4]*u.deg)
>>> sc2 = SkyCoord([1, 20]*u.deg, [3, 4]*u.deg, obstime='2020-01-01')
>>> sc1 == sc2  
...
ValueError: cannot compare: extra frame attribute 'obstime' is not equivalent
 (perhaps compare the frames directly to avoid this exception)

本例では、 obstime 属性はICRS座標フレームに直接適用されないいわゆる“余分”フレーム属性である.したがって,今回は以下と比較することができる. != 品種演算子::

>>> sc1.frame != sc2.frame
array([False, True])

1つのやや特殊な場合は、両方ともデータがないフレームを比較することであり、返り値と frame1.is_equivalent_frame(frame2) それがそうです。例えば:

>>> from astropy.coordinates import FK4
>>> FK4() == FK4(obstime='2020-01-01')
False

便利な方法

利用可能な便利な方法がたくさんあります。次の使用可能な文書文字列を読むことをお勧めします。

より多くの情報と例については、参照されたい 色分解、オフセット、ディレクトリマッチング、および関連機能 そして 空間運動会計 それがそうです。