Working with lists and arrays

PyUnitWizard helps you to concatenate or stack lists, tuples or arrays of quantities

Sometimes we work with a list of quantites, but we need a quantity where the value is a list. Or sometimes we work with a list of array quantities and we need to stack them in a single quantity. Have a look to this documentation section to find out some useful tools to work with lists of quantities.

Let’s show how the methods pyunitwizard.string_to_quantity() and pyunitwizard.string_to_unit() work:

Concatenate

Let’s show how the method pyunitwizard.concatenate() works with a simple example. Let’s suppose we have a list of quantities:

import pyunitwizard as puw
import numpy as np
puw.configure.load_library(['pint', 'openmm.unit'])
puw.configure.set_default_form('pint')
list_quantities = [puw.quantity(ii, 'nm') for ii in range(10)]
list_quantities
[0 <Unit('nanometer')>,
 1 <Unit('nanometer')>,
 2 <Unit('nanometer')>,
 3 <Unit('nanometer')>,
 4 <Unit('nanometer')>,
 5 <Unit('nanometer')>,
 6 <Unit('nanometer')>,
 7 <Unit('nanometer')>,
 8 <Unit('nanometer')>,
 9 <Unit('nanometer')>]

But we need a unique quantity with all former values in a single list:

quantity = puw.concatenate(list_quantities)
quantity
Magnitude
[0 1 2 3 4 5 6 7 8 9]
Unitsnanometer

The function pyunitwizard.concatenate() can operate also with numpy array:

list_quantities = [ puw.quantity(np.zeros([3,2]), 'nm') for ii in range(2)]
list_quantities += [ puw.quantity(np.ones([3,2]), 'angstroms') for ii in range(2)]
list_quantities
[array([[0., 0.],
        [0., 0.],
        [0., 0.]]) <Unit('nanometer')>,
 array([[0., 0.],
        [0., 0.],
        [0., 0.]]) <Unit('nanometer')>,
 array([[1., 1.],
        [1., 1.],
        [1., 1.]]) <Unit('angstrom')>,
 array([[1., 1.],
        [1., 1.],
        [1., 1.]]) <Unit('angstrom')>]
quantity = puw.concatenate(list_quantities, type_value='numpy.ndarray', to_unit='nm', to_form='openmm.unit')
quantity
Quantity(value=array([[[0. , 0. ],
        [0. , 0. ],
        [0. , 0. ]],

       [[0. , 0. ],
        [0. , 0. ],
        [0. , 0. ]],

       [[0.1, 0.1],
        [0.1, 0.1],
        [0.1, 0.1]],

       [[0.1, 0.1],
        [0.1, 0.1],
        [0.1, 0.1]]]), unit=nanometer)

Notice that the concatenate function does not only work with sequences of quantities, it can also process sequences of sequences of quantities:

list_quantities = [ [puw.quantity(ii, 'nm') for ii in range(3)] for jj in range(4)]
list_quantities
[[0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>],
 [0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>],
 [0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>],
 [0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>]]
quantity = puw.concatenate(list_quantities)
quantity
Magnitude
[0 1 2 0 1 2 0 1 2 0 1 2]
Unitsnanometer

Stack

The function pyunitwizard.stack() joins a sequence of sequences of quantities along a new axis (same behaviour as numpy.stack). Let’s have a look to the following example:

list_list_quantities = [ [puw.quantity(ii, 'nm') for ii in range(3)] for jj in range(4)]
list_list_quantities
[[0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>],
 [0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>],
 [0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>],
 [0 <Unit('nanometer')>, 1 <Unit('nanometer')>, 2 <Unit('nanometer')>]]
quantity = puw.stack(list_quantities, type_value='numpy.ndarray')
quantity
Magnitude
[[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]]
Unitsnanometer