Source code for microcalorimetry.math.numbers
"""
Generic numerical methods.
"""
import xarray as xr
[docs]
def mean_unique_values(arr: xr.DataArray, dim: str):
"""
Average duplicate values across a dimension.
"""
old_coords = {k: v for k, v in arr.coords.items() if k != dim}
out = arr.groupby(dim).mean(dim)
# copy over coordinates from the old array
# don't include the dimension that was grouped and averaged
out = out.assign_coords(old_coords)
return out
[docs]
def greedy_average(*arrays: xr.DataArray) -> xr.DataArray:
"""
Average arrays by alligning coordinates.
Missing values are ignored during the averaging.
Parameters
----------
*arrays : xr.DataArray
Arrays to greedy average across.
"""
alligned = xr.align(*arrays, join='outer')
alligned = xr.concat(alligned, dim='__all__')
mean = alligned.mean(dim='__all__', skipna=True)
return mean
[docs]
def greedy_std(
*arrays: xr.DataArray,
ddof: int = 1,
min_points: int = 3,
) -> xr.DataArray:
"""
Take the standard deviation across arrays.
Values missing between the arrays are ignored.
Parameters
----------
ddof : int, optional
DDOF, set to 1 for an unbiased estimator, by default 1
min_points : int, optional
_description_, by default 3
Returns
-------
xr.DataArray
_description_
"""
alligned = xr.align(*arrays, join='outer')
alligned = xr.concat(alligned, dim='__all__')
std = alligned.std(dim='__all__', ddof=ddof, skipna=True)
return std