标准单位

标准单位在 astropy.units 打包为对象实例。

所有单位都是用基本的“不可约”单位来定义的。不可约单位包括:

  • 长度(米)

  • 时间(秒)

  • 质量(千克)

  • 电流(安培)

  • 温度(开尔文)

  • 角距离(弧度)

  • 立体角(立体角)

  • 发光强度(坎德拉)

  • 星等

  • 物质量(摩尔)

  • 光子计数(光子)

(配合标准要求的基础单元也比较模糊,不再建议使用。)

涉及基本单位组合的单元是 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二进制前缀(对于 bitbyte )支持:

可用的十进制前缀

符号

前缀

价值

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号

可用的二进制前缀

符号

前缀

价值

基比-

2**10年

惯性矩

梅比-

2**20年

地理标志

基比-

2**30年

Ti公司

特比-

2**40

圆周率

佩比-

2**50

工程安装

exbi公司-

2**60

无量纲单位

除了这些单位, astropy.units 包括无量纲单位的概念,用于表示没有物理尺寸的量。这在概念上不同于等于 None :表示数据中或用户未指定单位。

为了方便起见,有一个既无量纲又无标度的单位:the dimensionless_unscaled 对象:

>>> from astropy import units as u
>>> 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
u'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和天体物理单位。但是,您可能希望启用英制单位或其他用户定义的单位。

例子

要启用英制单位,请执行以下操作:

>>> from astropy.units import imperial
>>> imperial.enable()  
>>> 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            ,
  ft           | 0.3048 m        | foot                  ,
  fur          | 201.168 m       | furlong               ,
  inch         | 0.0254 m        |                       ,
  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                  ,
]

这也可以与 with 语句,以临时启用其他单元:

>>> from astropy import units as u
>>> from astropy.units import imperial
>>> with imperial.enable():
...     print(u.m.find_equivalent_units())
      Primary name | Unit definition | Aliases
...

要仅启用特定单位,请使用 add_enabled_units ::

>>> from astropy import units as u
>>> from astropy.units import imperial
>>> with u.add_enabled_units([imperial.knot]):
...     print(u.m.find_equivalent_units())
      Primary name | Unit definition | Aliases
...