Source code for umami.calculations.metric.aggregate
import numpy as np
def _aggregate(vals, method, **kwds):
# inspect numpy namespace:
function = np.__dict__[method]
# calc value
out = function(vals, **kwds)
if np.isscalar(out):
return out
else:
msg = "umami: Aggregation did not yield a scalar."
raise ValueError(msg)
[docs]def aggregate(grid, field, method, **kwds):
"""Calculate an aggreggate value on a Landlab grid field.
``aggregate`` calculates aggregate values on the core nodes of the model
grid. It supports all methods in the `numpy`_ namespace that reduce an
array to a scalar.
.. _numpy: https://numpy.org
Parameters
----------
grid : Landlab model grid
field : str
An at-node Landlab grid field that is present on the model grid.
method : str
The name of a numpy namespace method.
**kwds
Any additional keyword arguments needed by the method.
Returns
-------
out : float
The aggregate value.
Examples
--------
First an example that only uses the ``aggregate`` function.
>>> from landlab import RasterModelGrid
>>> from umami.calculations import aggregate
>>> grid = RasterModelGrid((10, 10))
>>> z = grid.add_zeros("node", "topographic__elevation")
>>> z += grid.x_of_node + grid.y_of_node
``aggregate`` supports all functions in the `numpy`_ namespace. Here we
show `mean`_ and `percentile`_. The latter of which takes an additional
argument, *q*.
.. _numpy: https://numpy.org
.. _mean: https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html
.. _percentile: https://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html
>>> aggregate(grid, "topographic__elevation", "mean")
9.0
>>> aggregate(grid, "topographic__elevation", "percentile", q=10)
5.0
Next, the same calculations are shown as part of an umami ``Metric``.
>>> from io import StringIO
>>> from umami import Metric
>>> file_like=StringIO('''
... me:
... _func: aggregate
... method: mean
... field: topographic__elevation
... ep10:
... _func: aggregate
... method: percentile
... field: topographic__elevation
... q: 10
... ''')
>>> metric = Metric(grid)
>>> metric.add_from_file(file_like)
>>> metric.names
['me', 'ep10']
>>> metric.calculate()
>>> metric.values
[9.0, 5.0]
"""
vals = grid.at_node[field][grid.core_nodes]
return _aggregate(vals, method, **kwds)