Quantities, Units, and Constants
%matplotlib inline
Quantities, Units, and Constants#
The purpose of this demo is to demonstrate the capabilities of astropy
astropy.units.Unit
, astropy.units.Quantity
, and astropy.units.Constant
.
The astropy astropy.units.Quantity
object
handles defining, converting between, and performing arithmetic
with physical quantities, such as meters, seconds, Hz, etc.
from astropy import units as u
import numpy as np
You can define a astropy.units.Quantity
(a number with a unit) in a number of different ways.
42.0 * u.meter
[1., 2., 3.] * u.s
np.arange(10) * u.Hz
These objects work as you would expect with most Python operators or numpy functions
np.power(2 * u.s, 3)
(2 * u.s) ** 2
If needed you can get the value as well as the unit
q = 42.0 * u.meter
print("The value is {0} and the unit is {1}".format(q.value, q.unit))
The value is 42.0 and the unit is m
Using the astropy.units.Quantity.to
function we can easily converted to
another unit.
print(q.to('parsec'))
1.3611273015666334e-15 pc
and imperial units as also supported
from astropy.units import imperial
print(q.to(imperial.mile))
0.026097590073968023 mi
Units that “cancel out” become a special unit called the “dimensionless unit”:
u.m / u.m
More complex conversions are also supported using
astropy.units.equivalencies
.
For example, we can convert the GOES wavelength range to Hz or keV easily using
the astropy.units.equivalencies.spectral
.
print(([0.5, 4.0] * u.angstrom).to('Hz', u.spectral()))
print(([0.5, 4.0] * u.angstrom).to('keV', u.spectral()))
[5.99584916e+18 7.49481145e+17] Hz
[24.79683969 3.09960496] keV
Astropy provides a number of reference constants
from astropy import constants as astropy_const
SunPy also provides a number of relevant solar reference constants.
from sunpy.sun import constants as sunpy_const
astropy.units.Constant
are simply quantities but they also provide an uncertainty
and a reference
M_earth = astropy_const.M_earth
print("The mass of the Earth is {0} +/- {1} {2} [ref {3}].".format(M_earth.value, M_earth.uncertainty, M_earth.unit, M_earth.reference))
The mass of the Earth is 5.972167867791379e+24 +/- 1.3422009501651213e+20 kg [ref IAU 2015 Resolution B 3 + CODATA 2018].
The light travel time in minutes from the Sun to the Earth can be calculated
print((sunpy_const.au / astropy_const.c).to('min'))
8.316746397269274 min
Let’s define a function to calculate the plasma beta, with quantities we don’t have to worry about much beyond getting the equation correct
def plasma_beta(n, T, B):
return (2 * n * astropy_const.k_B * T) / (B ** 2 / (2 * astropy_const.mu0))
The plasma beta for the solar corona using appropriate parameters is given by the following. The decompose function works to simplify the units.
print(plasma_beta(1e9 * u.cm**-3, 3e6 * u.Kelvin, 10 * u.Gauss).decompose())
0.2081969643814698
If the input is given in the wrong units then an error may occur but a better way is to inforce the units on input. Let’s consider a simpler example here to calculate velocity. We use a function annotation to specify the units (this is a Python 3.5+ feature, see the quantity_input documentation for more details and Python 2 instructions):
@u.quantity_input
def speed(length: u.m, time: u.s):
return length / time