html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue
https://github.com/pydata/xarray/issues/4156#issuecomment-843971807,https://api.github.com/repos/pydata/xarray/issues/4156,843971807,MDEyOklzc3VlQ29tbWVudDg0Mzk3MTgwNw==,5637662,2021-05-19T10:33:08Z,2021-05-19T10:33:08Z,CONTRIBUTOR,"I have hacked something that does support the reading and writing of sparse arrays to a netcdf file, however I didn't know how and where to put this within xarray.

```
def ds_to_netcdf(ds, fn):
    dsorg = ds
    ds = dsorg.copy()
    for v in ds:
        if hasattr(ds[v].data, ""nnz"") and (
            hasattr(ds[v].data, ""to_coo"") or hasattr(ds[v].data, ""linear_loc"")
        ):
            coord = f""_{v}_xarray_index_""
            assert coord not in ds
            data = ds[v].data
            if hasattr(data, ""to_coo""):
                data = data.to_coo()
            ds[coord] = coord, data.linear_loc()
            dims = ds[v].dims
            ds[coord].attrs[""compress""] = "" "".join(dims)
            at = ds[v].attrs
            ds[v] = coord, data.data
            ds[v].attrs = at
            ds[v].attrs[""_fill_value""] = str(data.fill_value)
            for d in dims:
                if d not in ds:
                    ds[f""_len_{d}""] = len(dsorg[d])

    print(ds)
    ds.to_netcdf(fn)
```

```
def xr_open_dataset(fn):
    ds = xr.open_dataset(fn)

    def fromflat(shape, i):
        index = []
        for fac in shape[::-1]:
            index.append(i % fac)
            i //= fac
        return tuple(index[::-1])

    for c in ds.coords:
        if ""compress"" in ds[c].attrs:
            vs = c.split(""_"")
            if len(vs) < 5:
                continue
            if vs[-1] != """" or vs[-2] != ""index"" or vs[-3] != ""xarray"":
                continue
            v = ""_"".join(vs[1:-3])
            at = ds[v].attrs
            dat = ds[v].data
            fill = ds[v].attrs.pop(""_fill_value"", None)
            if fill:
                knownfails = {""nan"": np.nan, ""False"": False, ""True"": True}
                if fill in knownfails:
                    fill = knownfails[fill]
                else:
                    fill = np.fromstring(fill, dtype=dat.dtype)
            dims = ds[c].attrs[""compress""].split()
            shape = []
            for d in dims:
                try:
                    shape.append(len(ds[d]))
                except KeyError:
                    shape.append(int(ds[f""_len_{d}""].data))
                    ds = ds.drop_vars(f""_len_{d}"")

            locs = fromflat(shape, ds[c].data)
            data = sparse.COO(locs, ds[v].data, shape, fill_value=fill)
            ds[v] = dims, data, ds[v].attrs, ds[v].encoding
    print(ds)
    return ds
```

Has there been any progress since last year?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,638947370