♪the Quantity オブジェクトは,数字に関連するある単位を持つ値を表す.

数量インスタンスの作成

Quantity オブジェクトは通常乗算によって作成されます Unit 物体です。

実例.

作成するには Quantity 15 m/秒を表示するには、以下の操作を実行してください。

>>> import astropy.units as u
>>> 15 * u.m / u.s  
<Quantity 15. m / s>

これは予期したように1単位で割ったり、使用したりすることに拡張されています numpy 配列またはPython配列:

>>> 1.25 / u.s
<Quantity 1.25 1 / s>
>>> [1, 2, 3] * u.m  
<Quantity [1., 2., 3.] m>
>>> import numpy as np
>>> np.array([1, 2, 3]) * u.m  
<Quantity [1., 2., 3.] m>

まだ使えます Quantity 指定された値と単位で関数を直接構築する:

>>> u.Quantity(15, u.m / u.s)  
<Quantity 15. m / s>

構造関数はより多くのオプションを提供する。特に、以下のシーケンスを統合することができます。 Quantity オブジェクト(それらのすべてのセルが等価であれば),簡単な文字列を解析する(プロファイルなどの解析に役立つ可能性がある):

>>> qlst = [60 * u.s, 1 * u.min]
>>> u.Quantity(qlst, u.minute)  
<Quantity [1.,  1.] min>
>>> u.Quantity('15 m/s')  
<Quantity 15. m / s>

現在の単位と値は unit そして value 属性:

>>> q = 2.5 * u.m / u.s
>>> q.unit
Unit("m / s")
>>> q.value
2.5

注釈

Quantity デフォルトの場合,オブジェクトは浮動小数点に変換される.また,入力されたどのデータも複製され,これは大きな配列にとって最適ではない可能性がある.議論のとおり further below 一つを取得することができます view 通りすがりに copy=False 至る Quantity または使用する << 交換手さん。

異なる単位に変換する

Quantity オブジェクトは異なる単位に変換できる. to() 方法です。

実例.

変換するには、以下の操作を実行してください Quantity 異なる単位の対象:

>>> q = 2.3 * u.m / u.s
>>> q.to(u.km / u.h)  
<Quantity 8.28 km / h>

便宜上。 si そして cgs 属性は Quantity SIまたはCGS単位を基準とするには、以下の操作を実行してください。

>>> q = 2.4 * u.m / u.s
>>> q.si  
<Quantity 2.4 m / s>
>>> q.cgs  
<Quantity 240. cm / s>

数量の値を異なる単位で表示したい場合は、ご利用いただけます to_value() ショートカットとして:

>>> q = 2.5 * u.m
>>> q.to_value(u.cm)
250.0

注釈

この値を cm まだ使っている q.to(u.cm).value それがそうです。違うのは to_value() 単位がすでに正しい単位であれば,変換を行わずに返す. view() データ(あなたがしたように q.value )である。対照的に to() 常にコピーに戻る(これは、変換が必要とされない場合に速度が遅いことも意味する)。議論のとおり further below 単位が正しければ使用可能である << 交換手さん。

比較量

Quantity 対象を以下のように比較することができる.

>>> from astropy import units as u
>>> u.allclose([1, 2] * u.m, [100, 200] * u.cm)
True
>>> u.isclose([1, 2] * u.m, [100, 20] * u.cm)  
array([ True, False])

土方量を描く

Quantity Matplotlibを使用してオブジェクトを簡単に描画することができます-参照 土方量を描く もっと細かいことを知っています。

算数をする.

足し算と引き算

間の足し算や引き算 Quantity オブジェクトの単位が等しい場合には,これらのオブジェクトをサポートする.

実例.

単位が等しい場合,生成されるオブジェクトは同じ単位を持つ:

>>> 11 * u.s + 30 * u.s  
<Quantity 41. s>
>>> 30 * u.s - 11 * u.s  
<Quantity 19. s>

単位が等しいが等しくなければ(例えば,キロと米),結果対象 対象の単位は左側にあります

>>> 1100.1 * u.m + 13.5 * u.km
<Quantity 14600.1 m>
>>> 13.5 * u.km + 1100.1 * u.m  
<Quantity 14.6001 km>
>>> 1100.1 * u.m - 13.5 * u.km
<Quantity -12399.9 m>
>>> 13.5 * u.km - 1100.1 * u.m  
<Quantity 12.3999 km>

足し算や引き算はサポートしていません Quantity オブジェクトと基本数値タイプ:

>>> 13.5 * u.km + 19.412  
Traceback (most recent call last):
  ...
UnitConversionError: Can only apply 'add' function to dimensionless
quantities when other argument is not a quantity (unless the
latter is all zero/infinity/nan)

無量綱の数を除いて(参照) Dimensionless Quantities )。

乗算と割り算

乗算と除算をサポートしています Quantity 任意の単位と数値タイプを持つオブジェクト.等価単位を持つオブジェクト間のこれらの動作については 生成されたオブジェクトは複合単位を持つ. それがそうです。

実例.

これらの操作を実行するためには,以下の操作を実行してください Quantity 対象:

>>> 1.1 * u.m * 140.3 * u.cm  
<Quantity 154.33 cm m>
>>> 140.3 * u.cm * 1.1 * u.m  
<Quantity 154.33 cm m>
>>> 1. * u.m / (20. * u.cm)  
<Quantity 0.05 m / cm>
>>> 20. * u.cm / (1. * u.m)  
<Quantity 20. cm / m>

乗算には、ご利用いただけます to() 方法:

>>> (1.1 * u.m * 140.3 * u.cm).to(u.m**2)  
<Quantity 1.5433 m2>
>>> (1.1 * u.m * 140.3 * u.cm).to(u.cm**2)  
<Quantity 15433. cm2>

除算では,単位が等しい場合には,単位を小さくすることで生成される対象を無次元にする必要がある可能性がある.そのために、お使いください decompose() 方法:

>>> (20. * u.cm / (1. * u.m)).decompose()  
<Quantity 0.2>

この方法は、より複雑な算術にも有用である。

>>> 15. * u.kg * 32. * u.cm * 15 * u.m / (11. * u.s * 1914.15 * u.ms)  
<Quantity 0.34195097 cm kg m / (ms s)>
>>> (15. * u.kg * 32. * u.cm * 15 * u.m / (11. * u.s * 1914.15 * u.ms)).decompose()  
<Quantity 3.41950973 kg m2 / s2>

NumPy関数

Quantity 対象は実際にはいっぱいだ numpy 配列(配列) Quantity クラス継承と拡張 numpy.ndarray )私たちは numpy 関数は数量的に正常である:

>>> q = np.array([1., 2., 3., 4.]) * u.m / u.s
>>> np.mean(q)
<Quantity 2.5 m / s>
>>> np.std(q)  
<Quantity 1.11803399 m / s>

これは、角度のような特定の単位のみを受け入れる関数を含む:

>>> q = 30. * u.deg
>>> np.sin(q)  
<Quantity 0.5>

無次元の数でもあります

>>> from astropy.constants import h, k_B
>>> nu = 3 * u.GHz
>>> T = 30 * u.K
>>> np.exp(-h * nu / (k_B * T))  
<Quantity 0.99521225>

Dimensionless Quantities より詳細な情報については、以下を参照されたい。

注釈

使用 numpy 1.17以前のバージョンでは、多くの非算術関数があります known issues またはユニットを無視したり(例えば、 np.dot )またはそれを正しく再初期化していない(例えば、 np.hstack )である。これはより複雑な関数に広がります np.linalg.norm それがそうです。

他のパケットからの関数、例えば scipy もっと不完全です(これを改善してください!)

無量綱量.

Pythonスカラーまたは無単位から無次元数を追加または削減する場合、無量綱数はこのような特徴を持つ ndarray あるいはそれらが伝達されて numpy 関数が無量綱数を受け取ると単位が簡略化されるため,数は無量綱と無スケールである.例えば:

>>> 1. + 1. * u.m / u.km  
<Quantity 1.001>

これは以下とは異なる.

>>> 1. + (1. * u.m / u.km).value
2.0

後者の場合結果は 2.0 なぜならこの職場は (1. * u.m / u.km) デフォルトでは伸縮がないわけではありません

>>> q = (1. * u.m / u.km)
>>> q.unit
Unit("m / km")
>>> q.unit.decompose()
Unit(dimensionless with a scale of 0.001)

しかしそうでないと Quantity このセルは自動的に無スケールに分解され,期待される結果を与える.

無量綱数を無量綱数を受け取る関数に渡す場合にもこのような場合がある.

>>> nu = 3 * u.GHz
>>> T = 30 * u.K
>>> np.exp(- h * nu / (k_B * T))  
<Quantity 0.99521225>

結果は、異なる数の単位を指定することとは無関係である。

>>> nu = 3.e9 * u.Hz
>>> T = 30 * u.K
>>> np.exp(- h * nu / (k_B * T))  
<Quantity 0.99521225>

純粋なPythonスカラに変換します

転換する. Quantity 対象は無次元数には適用できない:

>>> float(3. * u.m)
Traceback (most recent call last):
  ...
TypeError: only dimensionless scalar quantities can be converted
to Python scalars

逆に、無量綱値のみが純粋なPythonスカラーに変換できます:

>>> float(3. * u.m / (4. * u.m))
0.75
>>> float(3. * u.km / (4. * u.m))
750.0
>>> int(6. * u.km / (2. * u.m))
3000

受容数量関数

関数の数量パラメータを検証することは,同じ検査コードの複数回の重複を招く可能性がある.関数のいくつかのパラメータがあるか否かを検証する装飾器を提供する Quantity オブジェクト、およびこれらのユニットは、必要なユニットまたは物理タイプと互換性がある。

装飾器は、入力量を必要な単位に変換するのではなく、例えば、以下の例では角秒を度に変換し、このような変換が可能か否かのみを確認して検証する。 Quantity パラメータは計算に用いることができる.

装飾師. quantity_input キーワードパラメータは、どのパラメータを検証すべきか、およびそれらがどの単位と互換性があるべきかを指定するために受け入れられる。

実例.

存在するかどうかを検証する Quantity パラメータは、計算に使用することができる:

>>> @u.quantity_input(myarg=u.deg)
... def myfunction(myarg):
...     return myarg.unit
>>> myfunction(100*u.arcsec)
Unit("arcsec")

必要なデバイスを指定する物理的タイプに変更することもできます。

>>> @u.quantity_input(myarg='angle')
... def myfunction(myarg):
...     return myarg.unit
>>> myfunction(100*u.arcsec)
Unit("arcsec")

あるいは、 None キーワードパラメータもサポートしており,このような場合には,以下の場合にのみ入力をチェックする. None 通過:

>>> @u.quantity_input(a='length', b='angle')
... def myfunction(a, b=None):
...     return a, b
>>> myfunction(1.*u.km)  
(<Quantity 1. km>, None)
>>> myfunction(1.*u.km, 1*u.deg)  
(<Quantity 1. km>, <Quantity 1. deg>)

あるいは、注釈文法を使用して単位を提供することができます:

>>> @u.quantity_input  
... def myfunction(myarg: u.arcsec):
...     return myarg.unit
>>> myfunction(100*u.arcsec)  
Unit("arcsec")

また、非単位予期されるパラメータの異なるタイプに注釈を追加することができます:

>>> @u.quantity_input  
... def myfunction(myarg: u.arcsec, nice_string: str):
...     return myarg.unit, nice_string
>>> myfunction(100*u.arcsec, "a nice string")  
(Unit("arcsec"), 'a nice string')

返却値が変換されるリターン修飾、例えば、以下のように定義することができます。

>>> @u.quantity_input  
... def myfunction(myarg: u.arcsec) -> u.deg:
...     return myarg*1000

>>> myfunction(100*u.arcsec)  
<Quantity 27.77777778 deg>

これは,関数の返り値が期待と一致するかどうかを調べることもできるし,関数の結果の表示をよりきれいにすることもできる.

修飾子はまた、複数の有効ユニットを有する入力を受け入れるべき関数として、有効等価ユニットまたは物理タイプを指定するリストをサポートする。

>>> @u.quantity_input(a=['length', 'speed'])
... def myfunction(a):
...     return a.unit
>>> myfunction(1.*u.km)
Unit("km")
>>> myfunction(1.*u.km/u.s)
Unit("km / s")

ベクトルを単位で表す

Quantity 対象は、例えば numpy 配列は、特定の次元を指定することによって座標または行列要素を表すことによってベクトルまたは行列を表すが、これは、これらの次元が詳細に追跡されることを意味する。ベクトルの場合、座標での表現に変更することができ、これにより、デカルト以外の表現(例えば、球面または柱面)と、簡単なベクトル算術とを使用することができる。詳細については参照のこと 使用と設計座標表現法 それがそうです。

コピーなしの数の作成と変換

作成しています Quantity 1単位との乗算を用いて,下位データをコピーすることができる.これは伝承によって避けることができる。 copy=False 初期値設定項では.

実例.

重複しないように、ご利用ください copy=False **

>>> a = np.arange(5.)
>>> q = u.Quantity(a, u.m, copy=False)
>>> q  
<Quantity [0., 1., 2., 3., 4.] m>
>>> np.may_share_memory(a, q)
True
>>> a[0] = -1.
>>> q  
<Quantity [-1.,  1.,  2.,  3.,  4.] m>

これは、その入力を変更しない関数において特に有用である可能性があり、ユーザが入力した場合にも保証される。 Quantity 長さの単位を使って、それをメートルに変換します。

ショートカットとしてご利用いただけます << オペレータ::

>>> q = a << u.m
>>> np.may_share_memory(a, q)
True
>>> q  
<Quantity [-1.,  1.,  2.,  3.,  4.] m>

演算子の動作方式は初期化と同様である. copy=False 上に述べたように

>>> q << u.cm  
<Quantity [-100.,  100.,  200.,  300.,  400.] cm>

これは在位転換にも使えます

>>> q <<= u.cm
>>> q  
<Quantity [-100.,  100.,  200.,  300.,  400.] cm>
>>> a  
array([-100.,  100.,  200.,  300.,  400.])

サブクラス化数

サブクラスに分類する Quantity 通常はサブクラス化時のように操作されます ndarray (すなわち、通常カバーする必要があります __new__ そうではありません __init__ 使用しています numpy.ndarray.__array_finalize__ メソッドは属性を更新する).詳細については参照のこと NumPy documentation on subclassing それがそうです。関連する内容を理解するためには、確認してください Quantity それ自体は例えば astropy.units.Quantity.__array_finalize__ 伝達のための方法 unit 位置しています Angle 文字列は解析されています astropy.coordinates.Angle.__new__ 方法とある Longitude その中で astropy.coordinates.Longitude.__array_finalize__ 方法は、経度改行の角度を伝達するために使用される。

サブクラスで書き換えるもう1つの方法は Quantity はい、そうです astropy.units.Quantity.__quantity_subclass__ それがそうです。メソッドの単位は,どのタイプのサブクラスを返すかを決定する. Quantity それは作成されなければならない。例えばこれは Angle 一つ戻ります。 Quantity 戻り角度単位以外の単位を計算すると.これを実現することは SpecificTypeQuantity より一般的にはユーザ構造を可能にします Quantity 特定の物理タイプにのみ有用な方法を有するサブクラス。