For more information about the features presented below, you can read the astropy.units docs.

Astropy includes a powerful framework for units that allows users to attach units to scalars and arrays, and manipulate/combine these, keeping track of the units.

Since we may want to use a number of units in expressions, it is easiest and most concise to import the units module with:

```
from astropy import units as u
```

though note that this will conflict with any variable called `u`.

Units can then be accessed with:

```
>>> u.m
Unit("m")
>>> u.pc
Unit("pc")
>>> u.s
Unit("s")
>>> u.kg
Unit("kg")
```

We can create composite units:

```
>>> u.m / u.kg / u.s**2
Unit("m / (kg s2)")
```

The most useful feature about the units is the ability to attach them to
scalars or arrays, creating `Quantity` objects:

```
>>> 3. * u.m
<Quantity 3.0 m>
>>> import numpy as np
>>> np.array([1.2, 2.2, 1.7]) * u.pc / u.year
<Quantity [ 1.2 2.2 1.7] pc / (yr)>
```

Quantities can then be combined:

```
>>> q1 = 3. * u.m
>>> q2 = 5. * u.cm / u.s / u.g**2
>>> q1 * q2
<Quantity 15.0 cm m / (g2 s)>
```

and converted to different units:

```
>>> (q1 * q2).to(u.m**2 / u.kg**2 / u.s)
<Quantity 150000.0 m2 / (kg2 s)>
```

The units and value of a quantity can be accessed separately via the `value` and `unit` attributes:

```
>>> q = 5. * u.pc
>>> q.value
5.0
>>> q.unit
Unit("pc")
```

The units of a quantity can be decomposed into a set of base units using the
`decompose()` method. By default, units will be decomposed to S.I.:

```
>>> (3. * u.cm * u.pc / u.g / u.year**2).decompose()
<Quantity 929.5706802193289 m2 / (kg s2)>
```

To decompose into c.g.s. units, one can do:

```
>>> (3. * u.cm * u.pc / u.g / u.year**2).decompose(u.cgs.bases)
<Quantity 9295.70680219329 cm2 / (g s2)>
```

The astropy.constants module contains
physical constants relevant for Astronomy, and these are defined with units
attached to them using the `astropy.units` framework. If we want to compute
the Gravitational force felt by a 100. * u.kg space probe by the Sun, at a
distance of 3.2au, we can do:

```
>>> from astropy.constants import G
>>> F = (G * 1. * u.M_sun * 100. * u.kg) / (3.2 * u.au)**2
>>> F
<Quantity 6.517421874999999e-10 m3 solMass / (AU2 s2)>
>>> F.to(u.N)
<Quantity 0.05792707869188191 N>
```

The full list of available physical constants is shown here (and additions are welcome!).

Level 1

What is 1 barn megaparsecs in teaspoons?

Click to Show/Hide Solution

```
>>> (1. * u.barn * u.Mpc).to(u.tsp)
<Quantity 0.626035029893 tsp>
```

Level 2

What is 3 nm^2 Mpc / m^3 in dimensionless units?

Click to Show/Hide Solution

```
>>> (3. * u.nm**2 * u.Mpc / u.m**3).decompose()
<Quantity 92570.327444 >
```

or to just get the numerical value:

```
>>> (3. * u.nm**2 * u.Mpc / u.m**3).decompose().value
92570.327444015755
```

Level 3

Try and convert 3 Angstroms to keV using the units framework. You will need to look through the documentation for astropy.units to see how this can be made to work.

Click to Show/Hide Solution

```
>>> (3 * u.angstrom).to(u.keV)
...
UnitsException: 'angstrom' (length) and 'keV' (energy) are not convertible
>>> (3 * u.angstrom).to(u.keV, equivalencies=u.spectral())
<Quantity 4.13280643067 keV>
```