Source code for eradiate.xarray._helpers
import typing as t
import xarray as xr
XarrayObj = t.Union[xr.DataArray, xr.Dataset]
[docs]
def unstack_mdistant_grid(obj: XarrayObj) -> XarrayObj:
"""
Reindex data produced by a :meth:`.MultiDistantMeasure.grid()` measure on
(VAA, VZA) dimensions.
This effectively reshapes the data, which is initially indexed on film width
and height dimensions (the latter having a single element).
Parameters
----------
obj : DataArray or Dataset
An xarray object produced by processing a
:meth:`.MultiDistantMeasure.grid()` measure, indexed on film dimensions.
Returns
-------
DataArray or Dataset
An object of the same type, reindexed on VZA and VAA coordinates.
"""
# Collect metadata
vza_attrs = obj["vza"].attrs
vaa_attrs = obj["vaa"].attrs
# Build new index
midx_values = (obj.vza.values.flatten(), obj.vaa.values.flatten())
result = obj.drop_vars(
["x_index", "x"]
) # Remove the x film coordinate (irrelevant after unstacking)
result = result.set_xindex(
["vza", "vaa"], tuples=midx_values
) # Reindex the x_index dimension with a multi-index using the vza and vaa variables
result = result.unstack() # Unstack the multi-level index
# Reapply metadata
result["vza"].attrs = vza_attrs
result["vaa"].attrs = vaa_attrs
return result