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