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] |
---|---|
Units | nanometer |
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] |
---|---|
Units | nanometer |
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] |
---|---|
Units | nanometer |