Integration with other libraries

One of the advantage of this module is that it supports calculations with NumPy arrays and Decimal precision libraries. In this section we describe the extent into which these libraries can be used and which operations are supported.

NumPy arrays

As discussed in previous sections, Quantity and Magnitude classes can be initialized with scalar and list/array value. The later are converted automatically into NumPy arrays, where all members of the array share common units. Quantities with array magnitudes can be sliced in the same way as NumPy arrays.

>>> q = Quantity([1,2,3], 'm')
>>> q[:2]
Quantity([1. 2.] m)

Numpy np.nan type can be also used as a quantity with units.

>>> Quantity(np.nan, 'm')
Quantity(nan m)
>>> NaN('cm')
Quantity(nan cm)

Basic arithmetic operations of array quantities with their modifications are summarized in the table below.

Operation with operators

Operation

Notes

+, -

Only quantities with the same units can be added/subtracted. Units of the first quantity is preserved.

*, /

Quantity units are multiplied/divided and form new units.

**

Both magnitude and units are raised on the dimensionless power.

>>> from scinumtools.units import *
>>> Quantity([2,3,4], 'm') + Quantity(2, 'cm')
Quantity([2.02 3.02 4.02] m)
>>> Quantity([2,3,4], 'm')**2
Quantity([ 4.  9. 16.] m2)

Available NumPy universal functions ufunc that can be used with quantities are give below.

Operations with universal functions

Operation

Notes

np.sqrt

Unit exponents are divided by 2.

np.cbrt

Unit exponents are divided by 3.

np.power

Unit exponents are raised on the given power.

np.sin, np.cos, np.tan

Input quantity must be convertible to radians and output quantity is dimensionless.

np.arcsin, np.arccos, np.arctan

Input quantity is dimensionless and output quantity is in radians.

np.isnan, np.isnat

Returns booleans

>>> import numpy as np
>>> np.sqrt(Quantity([4, 9, 16], 'm3'))
Quantity([2. 3. 4.] m3:2)
>>> np.sin(Quantity([45, 60], "deg"))
Quantity([0.707 0.866])

Several other important NumPy functions are also integrated.

Operations with functions

Operation

Notes

np.linspace

Units of the first quantity-argument are preserved

np.logspace

Units of the first quantity-argument are preserved

np.absolute, np.abs

Units of an argument are preserved

np.round, np.floor, np.ceil

Units of an argument are preserved

np.iscomplexobj

Returns false

np.sum

Returns the same quantity with summed magnitude

>>> np.linspace(0,Quantity(23,'km'),3)
Quantity([ 0.  11.5 23. ] km)
>>> np.floor(Quantity(2.3,'m'))
Quantity(2.000e+00 m)

More NumPy functions and operations can be implemented on demand. Please write an issue on GitHub and check out source code for new changes.

Decimal prescision

Quantity magnitudes have default precision of the Python’s float type or that of a NumPy array. Calculations with higher precision are possible in combination with Decimal library. As required by the library, all subsequent calculations must be done using Decimal values.

>>> from decimal import Decimal
>>> Quantity(Decimal(2.34234923498499399204), 'cm')
Quantity(2.342e+0 cm)
>>> a = Quantity(Decimal(3.3239840203948394e-3), 'cm')
>>> b = Quantity(Decimal(9.9239000409020932894e6), 'cm')
>>> a+b
Quantity(9.924e+6 cm)
>>> (a+b).value()
Decimal('9923900.044226077073258914050')
>>> a*b
Quantity(3.299e+4 cm2)
>>> (a*b).value()
Decimal('32986.88515595424986253677220')