Integrating with duck arrays


This is a experimental feature.

xarray can wrap custom duck array objects as long as they define numpy’s shape, dtype and ndim properties and the __array__, __array_ufunc__ and __array_function__ methods.

In certain situations (e.g. when printing the collapsed preview of variables of a Dataset), xarray will display the repr of a duck array in a single line, truncating it to a certain number of characters. If that would drop too much information, the duck array may define a _repr_inline_ method that takes max_width (number of characters) as an argument:

class MyDuckArray:

    def _repr_inline_(self, max_width):
        """ format to a single line with at most max_width characters """


To avoid duplicated information, this method must omit information about the shape and dtype. For example, the string representation of a dask array or a sparse matrix would be:

In [1]: import dask.array as da

In [2]: import xarray as xr

In [3]: import sparse

In [4]: a = da.linspace(0, 1, 20, chunks=2)

In [5]: a
Out[5]: dask.array<linspace, shape=(20,), dtype=float64, chunksize=(2,), chunktype=numpy.ndarray>

In [6]: b = np.eye(10)

In [7]: b[[5, 7, 3, 0], [6, 8, 2, 9]] = 2

In [8]: b = sparse.COO.from_numpy(b)

In [9]: b
Out[9]: <COO: shape=(10, 10), dtype=float64, nnz=14, fill_value=0.0>

In [10]: xr.Dataset({"a": ("x", a), "b": (("y", "z"), b)})
Dimensions:  (x: 20, y: 10, z: 10)
Dimensions without coordinates: x, y, z
Data variables:
    a        (x) float64 dask.array<chunksize=(2,), meta=np.ndarray>
    b        (y, z) float64 <COO: nnz=14, fill_value=0.0>