等価物.

単位モジュールは、式が1つの単位内の値を異なる単位に一意に関連付けることができるとき、いくつかの文脈において異なる単位間の等価性をサポートするための機構を有する。良い例は、放射波長の波長、周波数、およびエネルギー間の等価性を指定することである。一般に、これらの単位は変換不可能であるが、代表光と理解される場合には、変換可能である場合がある。ここでは、使い方をご紹介します astropy.units 新しい等価物をどのように定義するかということです

等価対リストを渡すことで equivalencies キーワードのパラメータです Quantity.to あるいは…。 Unit.to 方法:研究方法。代替的に、大きなコードのセグメントが同じ等価項を必要とする場合、それらを設定することができる given context それがそうです。

等価物を内蔵する

視差を距離に変換する方法

長さ単位 1秒以外の恒星は1角秒の視差を示すと定義される。(これは 視差.視差 そして 分秒角 ()

♪the parallax() 関数は、視差角と長さとの間の変換を処理する。

一般に、長さ単位を角に変更することはできないはずであり、その逆も同様である。 to() 異常を引き起こす:

>>> from astropy import units as u
>>> (0.8 * u.arcsec).to(u.parsec)  
Traceback (most recent call last):
  ...
UnitConversionError: 'arcsec' (angle) and 'pc' (length) are not convertible

視差角と距離の変換をトリガしますので、ご提供ください parallax() オプションのキーワードパラメータとして (equivalencies= )へ to() 方法です。

>>> (0.8 * u.arcsec).to(u.parsec, equivalencies=u.parallax())
<Quantity 1.25 pc>

角度を無次元単位とする

角度は物理的に異なるタイプとみなされ、これは一般に誤りを回避するのに役立つ。しかし,回転エネルギーや小角度近似に関する単位を用いる場合には,これはあまり便利ではない.(実際この二面性は弧から supplementary to derived unit )機能 dimensionless_angles() 角度と無量の綱単位との間の変換を容易にするために必要な等価項リストを提供する。これは、アークが増加する累乗の数(すなわち、ゼロを含む、したがって無次元である)を任意に変更することを可能にする点で、他のすべてと異なる。

実例.

正常な場合には、以下のような異常が発生します。

>>> from astropy import units as u
>>> u.degree.to('')  
Traceback (most recent call last):
  ...
UnitConversionError: 'deg' (angle) and '' (dimensionless) are not convertible
>>> (u.kg * u.m**2 * (u.cycle / u.s)**2).to(u.J)  
Traceback (most recent call last):
  ...
UnitConversionError: 'cycle2 kg m2 / s2' and 'J' (energy) are not convertible

しかし適切な変換関数を伝達すると dimensionless_angles() 機能しています

>>> u.deg.to('', equivalencies=u.dimensionless_angles())  
0.017453292519943295
>>> (0.5e38 * u.kg * u.m**2 * (u.cycle / u.s)**2).to(u.J,
...                            equivalencies=u.dimensionless_angles())  
<Quantity 1.9739208802178715e+39 J>
>>> import numpy as np
>>> np.exp((1j*0.125*u.cycle).to('', equivalencies=u.dimensionless_angles()))  
<Quantity  0.70710678+0.70710678j>

複数の例を有する場合、あなたはかなりの数の類似計算を行っている可能性が高い。このような場合には、選択することができます set default equivalencies それがそうです。

場合によっては、そのような効果的な行動は予想と異なるかもしれない。例えば、角速度に換算すると、一見合理的に見える。 \(\omega\) 毎秒アーク単位で対応する周波数に変換します \(f\) ヘルツを単位としています \(f=\omega/2\pi\) )である。しかし,これを試みると以下のような結果が生じる.

>>> (1*u.rad/u.s).to(u.Hz, equivalencies=u.dimensionless_angles())  
<Quantity 1. Hz>
>>> (1*u.cycle/u.s).to(u.Hz, equivalencies=u.dimensionless_angles())  
<Quantity 6.283185307179586 Hz>

ここで、第1例では~0.159 Hz、第2例では1 Hzであることが予想される。しかし、 dimensionless_angles() 毎秒アークに変換し,アーク単位でアークを破棄する.これらの例で犯した暗黙的な誤りは、単位Hzが毎秒サイクル数に等しいと考えられることであるが、事実はそうではない(“毎秒”にすぎない)。この認識はまた、毎秒サイクル数とヘルツとの間の明示的等価性を使用することによって解決策をもたらす:

>>> (1*u.rad/u.s).to(u.Hz, equivalencies=[(u.cy/u.s, u.Hz)])  
<Quantity 0.15915494309189535 Hz>
>>> (1*u.cy/u.s).to(u.Hz, equivalencies=[(u.cy/u.s, u.Hz)])  
<Quantity 1. Hz>

スペクトル単位.

spectral() 波長、周波数、エネルギー、周波数間の変換を処理するための等価リストを返す関数である。

視差単位を使用する際に説明したように、等価物リストを渡す(本例では、 spectral() )として to() 方法と波長、そして周波数とエネルギーを変換することができる。

>>> ([1000, 2000] * u.nm).to(u.Hz, equivalencies=u.spectral())  
<Quantity [2.99792458e+14, 1.49896229e+14] Hz>
>>> ([1000, 2000] * u.nm).to(u.eV, equivalencies=u.spectral())  
<Quantity [1.23984193, 0.61992096] eV>

これらの等価項は非基本単位にも適用されます

>>> # Inches to calories
>>> from astropy.units import imperial
>>> imperial.inch.to(imperial.Cal, equivalencies=u.spectral())  
1.869180759162485e-27

スペクトル(ドップラー)当量

スペクトル等価性は、波長、周波数、エネルギー、および周波数の間で変換することを可能にしますが、速度に変換することはできません。これは一般に関心のある量です。

等価性を定義するのはかなり便利ですが、違いがあることに注意してください conventions それがそうです。これらの約束の中で \(f_0\) 休憩の頻度です \(f\) 観測された周波数です \(V\) スピードとそれに \(c\) 光速です

  • ラジオ. \(V = c \frac{{f_0 - f}}{{f_0}} ; f(V) = f_0 ( 1 - V/c )\)

  • 光学系. \(V = c \frac{{f_0 - f}}{{f }} ; f(V) = f_0 ( 1 + V/c )^{{-1}}\)

  • 相対性理論 \(V = c \frac{{f_0^2 - f^2}}{{f_0^2 + f^2}} ; f(V) = f_0 \frac{{\left(1 - (V/c)^2\right)^{{1/2}}}}{{(1+V/c)}}\)

These three conventions are implemented in astropy.units.equivalencies as doppler_optical(), doppler_radio(), and doppler_relativistic().

例を引く

同項を定義するには、以下の操作を実行してください。

>>> restfreq = 115.27120 * u.GHz  # rest frequency of 12 CO 1-0 in GHz
>>> freq_to_vel = u.doppler_radio(restfreq)
>>> (116e9 * u.Hz).to(u.km / u.s, equivalencies=freq_to_vel)  
<Quantity -1895.4321928669085 km / s>

スペクトルフラックスと光度密度単位

スペクトルフラックスおよび光度密度単位、その等価表面輝度単位および積分流束単位も支持されている。変換されるスペクトル中の位置およびこれらのスペクトル位置の単位も提供する必要があるので、それらの使用はより複雑である。これらの単位変換を扱う関数は spectral_density() それがそうです。この関数は Quantity スペクトル位置を決定することができます

例を引く

実行単位換算を使用するには、以下の操作を実行してください spectral_density() **

>>> (1.5 * u.Jy).to(u.photon / u.cm**2 / u.s / u.Hz,
...                 equivalencies=u.spectral_density(3500 * u.AA)) 
<Quantity 2.6429114293019694e-12 ph / (cm2 Hz s)>
>>> (1.5 * u.Jy).to(u.photon / u.cm**2 / u.s / u.micron,
...                 equivalencies=u.spectral_density(3500 * u.AA))  
<Quantity 6467.9584789120845 ph / (cm2 micron s)>
>>> a = 1. * (u.photon / u.s / u.angstrom)
>>> a.to(u.erg / u.s / u.Hz,
...      equivalencies=u.spectral_density(5500 * u.AA))  
<Quantity 3.6443382634999996e-23 erg / (Hz s)>
>>> w = 5000 * u.AA
>>> a = 1. * (u.erg / u.cm**2 / u.s)
>>> b = a.to(u.photon / u.cm**2 / u.s, u.spectral_density(w))
>>> b  
<Quantity 2.51705828e+11 ph / (cm2 s)>
>>> b.to(a.unit, u.spectral_density(w))  
<Quantity 1. erg / (cm2 s)>

明るい温和な表面輝度当量

表面輝度(単位面積あたりのフラックス密度)と輝度温度の間には同等性がある。このような等価性は、一般に“アンテナ利得”と呼ばれるが、所与の周波数では、望遠鏡輝度感度は開口サイズに関係なく、フラックス密度感度は開口サイズに関連するので、この等価性は開口サイズのみに依存する。参照してください Tools of Radio Astronomy もっと細かいことを知っています。

注釈

ここでいう亮温とはレイリー−ジーンズ等価温度であり,その結果フラックスは温度と線形関係にある。これは観測値に関する最もよく使われる約束ですが、計算すれば 精確である. 黒体関数の温度が与えられたフラックスを生成する場合、このような効果値を使用すべきではない。

実例.

♪the brightness_temperature equivalency requires the beam area and frequency as arguments. Recalling that the area of a 2D Gaussian is \(2 \pi \sigma^2\) (see wikipedia )は、以下の一例である。

>>> import numpy as np
>>> beam_sigma = 50*u.arcsec
>>> omega_B = 2 * np.pi * beam_sigma**2
>>> freq = 5 * u.GHz
>>> (1*u.Jy/omega_B).to(u.K, equivalencies=u.brightness_temperature(freq))  
<Quantity 3.526295144567176 K>

ビーム全幅半値(FWHM)(よく引用され、FITSタイトルキーワードBMAJおよびBMINに格納されている値)がある場合、より適切な例は、FWHMをsigmaに変換する:

>>> import numpy as np
>>> beam_fwhm = 50*u.arcsec
>>> fwhm_to_sigma = 1. / (8 * np.log(2))**0.5
>>> beam_sigma = beam_fwhm * fwhm_to_sigma
>>> omega_B = 2 * np.pi * beam_sigma**2
>>> freq = 5 * u.GHz
>>> (1*u.Jy/omega_B).to(u.K, equivalencies=u.brightness_temperature(freq))  
<Quantity 19.553932298231704 K>

あなたはまだいて Jy/beam そして K 梁面積を指定することで:

>>> import numpy as np
>>> beam_fwhm = 50*u.arcsec
>>> fwhm_to_sigma = 1. / (8 * np.log(2))**0.5
>>> beam_sigma = beam_fwhm * fwhm_to_sigma
>>> omega_B = 2 * np.pi * beam_sigma**2
>>> freq = 5 * u.GHz
>>> (1*u.Jy/u.beam).to(u.K, u.brightness_temperature(freq, beam_area=omega_B))  
<Quantity 19.553932298231704 K>

ビーム等価

無線データ、特に干渉計からのデータは、通常、 Jy/beam それがそうです。この数字は、ビームとは無関係な値(例えば、 Jy/sr )、使用可能 beam_angular_area 等価性。

例を引く

単位を転換する手順 Jy/beam 至る Jy/sr **

>>> import numpy as np
>>> beam_fwhm = 50*u.arcsec
>>> fwhm_to_sigma = 1. / (8 * np.log(2))**0.5
>>> beam_sigma = beam_fwhm * fwhm_to_sigma
>>> omega_B = 2 * np.pi * beam_sigma**2
>>> (1*u.Jy/u.beam).to(u.MJy/u.sr, equivalencies=u.beam_angular_area(omega_B))  
<Quantity 15.019166691021288 MJy / sr>

注意してください。 radio_beam Packageは、ビーム入出力および様々な動作をより直接的に処理する。

温度エネルギー当量

この当量は、一般に電子ボルトで表される温度とそのエネルギー当量(すなわち、温度にボルツマン定数を乗じた)との間の変換を可能にする。太陽天文学もX線天文学も高エネルギー観測によく使われています

例を引く

温度とそのエネルギー当量との間で変換するには、以下の操作を実行してください。

>>> import astropy.units as u
>>> t_k = 1e6 * u.K
>>> t_k.to(u.eV, equivalencies=u.temperature_energy())  
<Quantity 86.17332384960955 eV>

熱力学温度当量

これが…。 thermodynamic_temperature() 等価性許容の Jy/beam “熱力学的温度”と呼ばれています \(T_{{CMB}}\) ケルビンにいます。

実例.

以下の項目の間で変換を行う. Jy/beam 熱力学的温度:

>>> import astropy.units as u
>>> nu = 143 * u.GHz
>>> t_k = 0.002632051878 * u.K
>>> t_k.to(u.MJy / u.sr, equivalencies=u.thermodynamic_temperature(nu))  
<Quantity 1. MJy / sr>

デフォルトの場合、これは使用されます \(T_{{CMB}}\) 中デフォルト宇宙学の値 astropy しかし,カスタマイズを指定することができる. \(T_{{CMB}}\) 等価性の第2の引数である特定の宇宙学の値:

>>> from astropy.cosmology import WMAP9
>>> t_k.to(u.MJy / u.sr, equivalencies=u.thermodynamic_temperature(nu, T_cmb=WMAP9.Tcmb0))  
<Quantity 0.99982392 MJy / sr>

モル質量AMU当量

この当量は原子質量単位と当量g/molの間の換算を許容する。文脈については,NIST定義を参照されたい SI Base Units それがそうです。

例を引く

原子質量単位と当量g/molの間で換算するには、以下の操作を実行してください。

>>> import astropy.units as u
>>> import astropy.constants as const
>>> x = 1 * (u.g / u.mol)
>>> y = 1 * u.u
>>> x.to(u.u, equivalencies=u.molar_mass_amu()) 
<Quantity 1.0 u>
>>> y.to(u.g/u.mol, equivalencies=u.molar_mass_amu()) 
<Quantity 1.0 g / mol>

画素スケールと板スケールの等価性

これらの等価物は、角度スケールと焦点面における線形スケールまたは画素数単位の距離との間で変換するために使用される。

実例.

スローンデジタルスカイ調査(Sloan Digital Sky Survey)におけるクリップ画を使用していると仮定すると、デフォルトの画素の割合は1画素当たり0.4角秒であり、クリップ画像で240画素の物体の真の大きさを測定したい。

>>> import astropy.units as u
>>> sdss_pixelscale = u.pixel_scale(0.4*u.arcsec/u.pixel)
>>> (240*u.pixel).to(u.arcmin, sdss_pixelscale)  
<Quantity 1.6 arcmin>

あるいは、望遠鏡のための機器を設計しています。この装置の反転目盛りは1弧当たり7.8メートル(ご希望の焦点距離のため)で、半角秒を覆うのにどのくらいの画素が必要か知りたいと言われています。

>>> import astropy.units as u
>>> tel_platescale = u.plate_scale(7.8*u.m/u.radian)
>>> (0.5*u.arcsec).to(u.micron, tel_platescale)  
<Quantity 18.9077335632719 micron>

画素比等価性は、より一般的なコンテキストで使用されてもよく、割合は、低減可能な任意の量として指定されてもよい。 <composite unit>/u.pix あるいは…。 u.pix/<composite unit> (つまり、 u.pix 1または-1)である.例えば、デジタル画像の1インチ当たりの点数(DPI)を定義して、その物理的なサイズを計算することができます。

>>> import astropy.units as u
>>> dpi = u.pixel_scale(100 * u.pix / u.imperial.inch)
>>> (1024 * u.pix).to(u.cm, dpi)  
<Quantity 26.0096 cm>

光度学的零点等価性

この同等性は、光度システム(すなわち、特定の零点フラックスに対して定義されたシステム)と絶対フラックスとの間を移動する方法を提供する。これは,以下の支援と組み合わせて用いることが最も有用である. 震度と他の対数単位 それがそうです。

例を引く

フィルターを使用してターゲットを観察していると仮定して、その報告の標準零点は3631.1 Jy:

>>> target_flux = 1.2 * u.nanomaggy
>>> zero_point_star_equiv = u.zero_point_flux(3631.1 * u.Jy)
>>> u.Magnitude(target_flux.to(u.AB, zero_point_star_equiv))  
<Magnitude 22.30195136 mag(AB)>

ハッブル定数と“小h”当量を減少させました

ハッブル定数の無量綱バージョン--通常“小h”と呼ばれる--河外天体物理学でよく使われる量である。初心者がこれらの分野で生存する禍根とも広く考えられている(例えば、見出し参照)。 this paper また,これはhちゃんの使用にも価値のあるアドバイスを提供している). astropy 物理単位を“小さいh”単位に変換する方法(または物理単位から“小さいh”単位に変換する)を提供することによって、少なくとも場合によってはこれを維持するのを助けることができる等価性が提供される。

実例.

物理単位に変換するか、物理単位から“小h”単位に変換するには、以下の操作を実行してください。

>>> import astropy.units as u
>>> H0_70 = 70 * u.km/u.s / u.Mpc
>>> distance = 70 * (u.Mpc/u.littleh)
>>> distance.to(u.Mpc, u.with_H0(H0_70))  
<Quantity 100.0 Mpc>
>>> luminosity = 0.49 * u.Lsun * u.littleh**-2
>>> luminosity.to(u.Lsun, u.with_H0(H0_70))  
<Quantity 1.0 solLum>

設備名にご注意ください littleh :この単位は一般に文献では h これがそうです littleh “時間”と混同されないようにするためです

パラメータが与えられていない場合(またはパラメータが None )は、このような効果があると仮定する H0 現在のデフォルトの宇宙学によると

>>> distance = 100 * (u.Mpc/u.littleh)
>>> distance.to(u.Mpc, u.with_H0())  
<Quantity 147.79781259 Mpc>

この等価性はまた、hスケールの一般的な振幅式を可能にする:

>>> mag_quantity = 12 * (u.mag - u.MagUnit(u.littleh**2))
>>> mag_quantity  
<Magnitude 12. mag(1 / littleh2)>
>>> mag_quantity.to(u.mag, u.with_H0(H0_70))  
<Quantity 11.2254902 mag>

温度当量

♪the temperature() 等価物は摂氏、華氏温度、ランケンとケルビンの間で変換することを可能にする。

例を引く

温度レベル間で変換するには、以下の操作を実行してください。

>>> import astropy.units as u
>>> temp_C = 0 * u.Celsius
>>> temp_Kelvin = temp_C.to(u.K, equivalencies=u.temperature())
>>> temp_Kelvin  
<Quantity 273.15 K>
>>> temp_F = temp_C.to(u.imperial.deg_F, equivalencies=u.temperature())
>>> temp_F  
<Quantity 32. deg_F>
>>> temp_R = temp_C.to(u.imperial.deg_R, equivalencies=u.temperature())
>>> temp_R  
<Quantity 491.67 deg_R>

注釈

ご利用いただけます u.deg_C ではなく u.Celsius それがそうです。

質エネルギー当量

狭義相対論の背景には,質量とエネルギーは等価な単位とすることができる。例えば:

>>> import astropy.units as u
>>> (1 * u.g).to(u.eV, u.mass_energy())  
<Quantity 5.60958865e+32 eV>

新しい等価物を書く

等価リストはタプルリストであり、各タプルは4つの要素を有する:

(from_unit, to_unit, forward, backward)

from_unit そして to_unit 等価な単位です。 forward そして backward これらの単位間で値を変換する関数である. forward そして backward 任意であり、省略されている場合、そのような等価性宣言の2つのユニットは等価であるとみなされるべきである。関数は、無限再帰を回避するために、非数量オブジェクトを受け入れて返さなければならない;参照されたい。 より複雑な例ですスペクトル·ドップラー当量は もっと細かいことを知っています。

実例.

1964年まで,リットルは4°C,760 mm水銀圧力での水1 kgの体積と定義されていた。体積および質量は通常直接換算できないが、1964年のリットルの定義における定数を真に維持すれば、それらのための等価物を確立することができる。

>>> liters_water = [
...    (u.l, u.g, lambda x: 1000.0 * x, lambda x: x / 1000.0)
... ]
>>> u.l.to(u.kg, 1, equivalencies=liters_water)
1.0

等価物は、任意の他の互換性デバイスと共に使用されてもよいことに留意されたい。

>>> from astropy.units import imperial
>>> imperial.gallon.to(imperial.pound, 1, equivalencies=liters_water)  
8.345404463333525

別の方向にも機能しています

>>> imperial.lb.to(imperial.pint, 1, equivalencies=liters_water)  
0.9586114172355459

より複雑な例ですスペクトル·ドップラー当量は

CO 1−0の無線約定を用いて等価性を定義する方法を示した。この関数はすでに定義されている doppler_radio() しかし、この例は例示的である。

>>> from astropy.constants import si
>>> restfreq = 115.27120  # rest frequency of 12 CO 1-0 in GHz
>>> freq_to_vel = [(u.GHz, u.km/u.s,
... lambda x: (restfreq-x) / restfreq * si.c.to_value('km/s'),
... lambda x: (1-x/si.c.to_value('km/s')) * restfreq )]
>>> u.Hz.to(u.km / u.s, 116e9, equivalencies=freq_to_vel)  
-1895.4321928669262
>>> (116e9 * u.Hz).to(u.km / u.s, equivalencies=freq_to_vel)  
<Quantity -1895.4321928669262 km / s>

これをGHzとKM/sに定義すると,他のすべての周波数や速度単位に適用されることに注意されたい. x 伝達される前に入力周波数単位(例えば、Hz)からGHzに変換される lambda x: それがそうです。同様に,返り値の単位を仮定する. km/s それがその理由です .valuec 定数の代わりに使われています

利用可能な等価項を示す

♪the find_equivalent_units() 方法は等価性も理解する.

例を引く

等価項を伝達することなく、3つの互換性のあるユニットが使用される Hz 標準集合では:

>>> u.Hz.find_equivalent_units()
  Primary name | Unit definition | Aliases
[
  Bq           | 1 / s           | becquerel    ,
  Ci           | 3.7e+10 / s    | curie        ,
  Hz           | 1 / s           | Hertz, hertz ,
]

しかしスペクトル等価性を見ると様々なものが見られます Hz 変換することができます

>>> u.Hz.find_equivalent_units(equivalencies=u.spectral())
  Primary name | Unit definition        | Aliases
[
  AU           | 1.49598e+11 m          | au, astronomical_unit ,
  Angstrom     | 1e-10 m                | AA, angstrom          ,
  Bq           | 1 / s                  | becquerel             ,
  Ci           | 3.7e+10 / s            | curie                 ,
  Hz           | 1 / s                  | Hertz, hertz          ,
  J            | kg m2 / s2             | Joule, joule          ,
  Ry           | 2.17987e-18 kg m2 / s2 | rydberg               ,
  cm           | 0.01 m                 | centimeter            ,
  eV           | 1.60218e-19 kg m2 / s2 | electronvolt          ,
  earthRad     | 6.3781e+06 m           | R_earth, Rearth       ,
  erg          | 1e-07 kg m2 / s2       |                       ,
  jupiterRad   | 7.1492e+07 m           | R_jup, Rjup, R_jupiter, Rjupiter ,
  k            | 100 / m                | Kayser, kayser        ,
  lyr          | 9.46073e+15 m          | lightyear             ,
  m            | irreducible            | meter                 ,
  micron       | 1e-06 m                |                       ,
  pc           | 3.08568e+16 m          | parsec                ,
  solRad       | 6.957e+08 m            | R_sun, Rsun           ,
]

より大きなコード片に等価物を使用する

時々、あなたは定期的に等価ユニット間で交互に切り替える複雑な計算を行う必要があるかもしれない。これらの場合、デフォルトで使用される等価項、方法、および enable other units それがそうです。

実例.

アークを無次元単位とするためには、以下の操作を実行してください。

>>> import astropy.units as u
>>> u.set_enabled_equivalencies(u.dimensionless_angles())
<astropy.units.core._UnitContext object at ...>
>>> u.deg.to('')  
0.017453292519943295

ここでは、任意の等価項目リストを使用することができ、または、例えば、追加することができる。 spectral() そして spectral_density() (これらのリターンリストは、それらを加算することによって結合されるべきであるからである)。

上記の方法の欠点は、デフォルト設定をオフにすることを忘れてしまう可能性があることである(空のパラメータを与えることによって達成される)。この動作を自動的に実行するためには、コンテキストマネージャを提供する必要がある:

>>> import astropy.units as u
>>> with u.set_enabled_equivalencies(u.dimensionless_angles()):
...    phase = 0.5 * u.cycle
...    c = np.exp(1j*phase)
>>> c  
<Quantity (-1+1.2246063538223773e-16j) >