标准单位#
标准单位在 astropy.units
打包为对象实例。
所有单位都是用基本的“不可约”单位来定义的。不可约单位包括:
长度(米)
时间(秒)
质量(千克)
电流(安培)
温度(开尔文)
角距离(弧度)
立体角(立体角)
发光强度(坎德拉)
星等
物质量(摩尔)
光子计数(光子)
(还有一些更鲜为人知的基本单位,需要 FITS Standard 不再推荐使用。)
涉及基本单位组合的单元是 CompositeUnit
. 在大多数情况下,您不需要担心各种各样的单元类,除非您想设计更复杂的情况。
模块中已预定义了许多单位。您可以使用 find_equivalent_units()
方法列出给定类型的所有现有预定义单位::
>>> from astropy import units as u
>>> u.g.find_equivalent_units()
Primary name | Unit definition | Aliases
[
M_e | 9.10938e-31 kg | ,
M_p | 1.67262e-27 kg | ,
earthMass | 5.97217e+24 kg | M_earth, Mearth ,
g | 0.001 kg | gram ,
jupiterMass | 1.89812e+27 kg | M_jup, Mjup, M_jupiter, Mjupiter ,
kg | irreducible | kilogram ,
solMass | 1.98841e+30 kg | M_sun, Msun ,
t | 1000 kg | tonne ,
u | 1.66054e-27 kg | Da, Dalton ,
]
前缀#
大多数单位都可以与前缀一起使用,标准的 SI 前缀和 IEEE 1514-2002 二进制前缀(用于 bit
和 byte
)支持:
可用的十进制前缀 |
||
---|---|---|
符号 |
前缀 |
价值 |
Q |
奎达- |
1e30 |
R |
罗娜- |
第1集第27集 |
Y |
约塔- |
1e24型 |
Z |
泽塔- |
1e21型 |
E |
埃克斯- |
1e18型 |
P |
善待动物组织- |
1e15型 |
T |
特拉- |
1e12型 |
G |
千兆- |
1e9级 |
M |
百万- |
1e6级 |
K |
公斤- |
1e3级 |
H |
赫克托- |
1e2级 |
DA |
德卡-,德卡 |
1级 |
D |
迪西- |
1e-1级 |
C |
厘- |
1e-2级 |
米 |
百万- |
1e-3级 |
U |
微型- |
1e-6级 |
N号 |
纳米- |
1e-9级 |
磷 |
皮科- |
1e-12级 |
F |
费托- |
1e-15级 |
一 |
阿托- |
1e-18号 |
Z |
玉米- |
1e-21号 |
Y |
约克托- |
1e-24号 |
R |
隆托- |
1E-27 |
问: |
奎克托- |
1E-30 |
可用的二进制前缀 |
||
---|---|---|
符号 |
前缀 |
价值 |
基 |
基比- |
2**10年 |
惯性矩 |
梅比- |
2**20年 |
地理标志 |
基比- |
2**30年 |
Ti公司 |
特比- |
2**40 |
圆周率 |
佩比- |
2**50 |
工程安装 |
exbi公司- |
2**60 |
无量纲单位#
除了这些单位, astropy.units
包括无量纲单位的概念,用于表示没有物理尺寸的量。这在概念上不同于等于 None
:表示数据中或用户未指定单位。
为了方便起见,有一个既无量纲又无标度的单位:the dimensionless_unscaled
对象:
>>> u.dimensionless_unscaled
Unit(dimensionless)
无量纲量通常被定义为不是无量纲的量的乘积或比值,但当它们的幂次相乘时,它们的量纲就抵消了。
实例#
使用 dimensionless_unscaled
对象:
>>> u.m / u.m
Unit(dimensionless)
为了与 单位和数量的字符串表示法 ,这相当于 Unit('')
和 Unit(1)
,尽管使用 u.dimensionless_unscaled
在Python中,首选代码为可读性::
>>> u.dimensionless_unscaled == u.Unit('')
True
>>> u.dimensionless_unscaled == u.Unit(1)
True
请注意,在许多情况下,无量纲单位也可能有刻度。例如::
>>> (u.km / u.m).decompose()
Unit(dimensionless with a scale of 1000.0)
>>> (u.km / u.m).decompose() == u.dimensionless_unscaled
False
举个例子说明为什么你想创建一个标度的无量纲量,假设你要用一个大的单位数来做很多计算, big_unitless_num = 20000000 # 20 million
,但你希望你所有的答案都是百万的倍数。这可以通过除法来实现 big_unitless_num
通过 1e6
,但这需要您记住,此比例因子已应用,这在多次计算后可能很难实现。相反,通过将值乘以 Unit(scale)
跟踪比例因子。例如::
>>> scale = 1e6
>>> big_unitless_num = 20 * u.Unit(scale) # 20 million
>>> some_measurement = 5.0 * u.cm
>>> some_measurement * big_unitless_num
<Quantity 100. 1e+06 cm>
要确定单位是否无量纲(但不考虑比例),请使用 physical_type
属性:
>>> (u.km / u.m).physical_type
PhysicalType('dimensionless')
>>> # This also has a scale, so it is not the same as u.dimensionless_unscaled
>>> (u.km / u.m) == u.dimensionless_unscaled
False
>>> # However, (u.m / u.m) has a scale of 1.0, so it is the same
>>> (u.m / u.m) == u.dimensionless_unscaled
True
启用其他单位#
默认情况下,只搜索“默认”单位 find_equivalent_units()
以及类似的搜索方法。这包括 SI , CGS 和天体物理单位。但是,您可能希望启用 Imperial 或其他用户定义的单位。
例子#
要启用英制单位,请执行以下操作:
>>> from astropy.units import imperial
>>> imperial.enable()
<astropy.units.core._UnitContext object at ...>
>>> u.m.find_equivalent_units()
Primary name | Unit definition | Aliases
[
AU | 1.49598e+11 m | au, astronomical_unit ,
Angstrom | 1e-10 m | AA, angstrom ,
cm | 0.01 m | centimeter ,
earthRad | 6.3781e+06 m | R_earth, Rearth ,
ft | 0.3048 m | foot ,
fur | 201.168 m | furlong ,
inch | 0.0254 m | ,
jupiterRad | 7.1492e+07 m | R_jup, Rjup, R_jupiter, Rjupiter ,
lsec | 2.99792e+08 m | lightsecond ,
lyr | 9.46073e+15 m | lightyear ,
m | irreducible | meter ,
mi | 1609.34 m | mile ,
micron | 1e-06 m | ,
mil | 2.54e-05 m | thou ,
nmi | 1852 m | nauticalmile, NM ,
pc | 3.08568e+16 m | parsec ,
solRad | 6.957e+08 m | R_sun, Rsun ,
yd | 0.9144 m | yard ,
]
这也可以与 Python "with" statement ,临时启用附加设备:
>>> with imperial.enable():
... print(u.m.find_equivalent_units())
Primary name | Unit definition | Aliases
...
要仅启用特定设备,请使用 add_enabled_units()
**
>>> with u.add_enabled_units([imperial.knot]):
... print(u.m.find_equivalent_units())
Primary name | Unit definition | Aliases
...