Closed
Description
With pint-xarray
you can create a chunked, unit-aware xarray object, but calling a calculation method and then computing doesn't appear to behave as hoped.
da = xr.DataArray([1,2,3], attrs={'units': 'metres'})
chunked = da.chunk(1).pint.quantify()
print(chunked.compute())
<xarray.DataArray (dim_0: 3)>
<Quantity([1 2 3], 'meter')>
Dimensions without coordinates: dim_0
So far this is fine, but if we try to take a mean before computing we get
print(chunked.mean().compute())
<xarray.DataArray ()>
<Quantity(dask.array<true_divide, shape=(), dtype=float64, chunksize=(), chunktype=numpy.ndarray>, 'meter')>
/home/tegn500/miniconda3/envs/py38-mamba/lib/python3.8/site-packages/dask/array/core.py:3139: UserWarning: Passing an object to dask.array.from_array which is already a Dask collection. This can lead to unexpected behavior.
warnings.warn(
This is not correct: as well as the UserWarning, the return value of compute is a dask array, meaning we need to compute a second time to actually get the answer:
print(chunked.mean().compute().compute())
<xarray.DataArray ()>
<Quantity(2.0, 'meter')>
/home/tegn500/miniconda3/envs/py38-mamba/lib/python3.8/site-packages/dask/array/core.py:3139: UserWarning: Passing an object to dask.array.from_array which is already a Dask collection. This can lead to unexpected behavior.
warnings.warn(
If we try chunking the other way (chunked = da.pint.quantify().pint.chunk(1)
) then we get all the same results.
xref xarray-contrib/pint-xarray#116 and #4972 @keewis