|
78 | 78 | ) |
79 | 79 | from .missing import get_clean_interp_index |
80 | 80 | from .options import OPTIONS, _get_keep_attrs |
81 | | -from .pycompat import dask_version, is_duck_dask_array |
| 81 | +from .pycompat import is_duck_dask_array, sparse_array_type |
82 | 82 | from .utils import ( |
83 | 83 | Default, |
84 | 84 | Frozen, |
@@ -4028,24 +4028,36 @@ def unstack( |
4028 | 4028 |
|
4029 | 4029 | result = self.copy(deep=False) |
4030 | 4030 | for dim in dims: |
4031 | | - if not sparse and all( |
4032 | | - # Dask arrays recently supports assignment by index, |
4033 | | - # https://github.com/dask/dask/pull/7393 |
4034 | | - dask_version >= "2021.04.0" and is_duck_dask_array(v.data) |
4035 | | - # Numpy arrays handles the fast path: |
4036 | | - or isinstance(v.data, np.ndarray) |
4037 | | - for v in self.variables.values() |
| 4031 | + |
| 4032 | + if ( |
| 4033 | + # Dask arrays don't support assignment by index, which the fast unstack |
| 4034 | + # function requires. |
| 4035 | + # https://github.com/pydata/xarray/pull/4746#issuecomment-753282125 |
| 4036 | + any(is_duck_dask_array(v.data) for v in self.variables.values()) |
| 4037 | + # Sparse doesn't currently support (though we could special-case |
| 4038 | + # it) |
| 4039 | + # https://github.com/pydata/sparse/issues/422 |
| 4040 | + or any( |
| 4041 | + isinstance(v.data, sparse_array_type) |
| 4042 | + for v in self.variables.values() |
| 4043 | + ) |
| 4044 | + or sparse |
| 4045 | + # Until https://github.com/pydata/xarray/pull/4751 is resolved, |
| 4046 | + # we check explicitly whether it's a numpy array. Once that is |
| 4047 | + # resolved, explicitly exclude pint arrays. |
| 4048 | + # # pint doesn't implement `np.full_like` in a way that's |
| 4049 | + # # currently compatible. |
| 4050 | + # # https://github.com/pydata/xarray/pull/4746#issuecomment-753425173 |
| 4051 | + # # or any( |
| 4052 | + # # isinstance(v.data, pint_array_type) for v in self.variables.values() |
| 4053 | + # # ) |
| 4054 | + or any( |
| 4055 | + not isinstance(v.data, np.ndarray) for v in self.variables.values() |
| 4056 | + ) |
4038 | 4057 | ): |
4039 | | - # Fast unstacking path: |
4040 | | - result = result._unstack_once(dim, fill_value) |
4041 | | - else: |
4042 | | - # Slower unstacking path, examples of array types that |
4043 | | - # currently has to use this path: |
4044 | | - # * sparse doesn't support item assigment, |
4045 | | - # https://github.com/pydata/sparse/issues/114 |
4046 | | - # * pint has some circular import issues, |
4047 | | - # https://github.com/pydata/xarray/pull/4751 |
4048 | 4058 | result = result._unstack_full_reindex(dim, fill_value, sparse) |
| 4059 | + else: |
| 4060 | + result = result._unstack_once(dim, fill_value) |
4049 | 4061 | return result |
4050 | 4062 |
|
4051 | 4063 | def update(self, other: "CoercibleMapping") -> "Dataset": |
|
0 commit comments