Skip to content

Commit f4ef34f

Browse files
AlexHilsonshoyer
authored andcommitted
Fix to_iris conversion issues (#2111)
* TST: assert lazy array maintained by to_iris (#2046) * Add masked_invalid array op, resolves to_iris rechunking issue (#2046) * Fix dask_module in duck_array_ops.masked_invalid * Really fix it * Resolving to_iris dask array issues
1 parent 218ad54 commit f4ef34f

File tree

4 files changed

+12
-13
lines changed

4 files changed

+12
-13
lines changed

doc/whats-new.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ Bug fixes
8686
By `Deepak Cherian <https://github.com/dcherian>`_.
8787
- Colorbar limits are now determined by excluding ±Infs too.
8888
By `Deepak Cherian <https://github.com/dcherian>`_.
89+
- Fixed ``to_iris`` to maintain lazy dask array after conversion (:issue:`2046`).
90+
By `Alex Hilson <https://github.com/AlexHilson>`_ and `Stephan Hoyer <https://github.com/shoyer>`_.
8991

9092
.. _whats-new.0.10.3:
9193

xarray/convert.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from .coding.times import CFDatetimeCoder, CFTimedeltaCoder
88
from .conventions import decode_cf
9+
from .core import duck_array_ops
910
from .core.dataarray import DataArray
1011
from .core.dtypes import get_fill_value
1112
from .core.pycompat import OrderedDict, range
@@ -94,7 +95,6 @@ def to_iris(dataarray):
9495
# Iris not a hard dependency
9596
import iris
9697
from iris.fileformats.netcdf import parse_cell_methods
97-
from xarray.core.pycompat import dask_array_type
9898

9999
dim_coords = []
100100
aux_coords = []
@@ -121,13 +121,7 @@ def to_iris(dataarray):
121121
args['cell_methods'] = \
122122
parse_cell_methods(dataarray.attrs['cell_methods'])
123123

124-
# Create the right type of masked array (should be easier after #1769)
125-
if isinstance(dataarray.data, dask_array_type):
126-
from dask.array import ma as dask_ma
127-
masked_data = dask_ma.masked_invalid(dataarray)
128-
else:
129-
masked_data = np.ma.masked_invalid(dataarray)
130-
124+
masked_data = duck_array_ops.masked_invalid(dataarray.data)
131125
cube = iris.cube.Cube(masked_data, **args)
132126

133127
return cube

xarray/core/duck_array_ops.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ def isnull(data):
101101
einsum = _dask_or_eager_func('einsum', array_args=slice(1, None),
102102
requires_dask='0.17.3')
103103

104+
masked_invalid = _dask_or_eager_func(
105+
'masked_invalid', eager_module=np.ma,
106+
dask_module=getattr(dask_array, 'ma', None))
107+
104108

105109
def asarray(data):
106110
return data if isinstance(data, dask_array_type) else np.asarray(data)

xarray/tests/test_dataarray.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3038,12 +3038,11 @@ def test_to_and_from_iris_dask(self):
30383038
roundtripped = DataArray.from_iris(actual)
30393039
assert_identical(original, roundtripped)
30403040

3041-
# If the Iris version supports it then we should get a dask array back
3041+
# If the Iris version supports it then we should have a dask array
3042+
# at each stage of the conversion
30423043
if hasattr(actual, 'core_data'):
3043-
pass
3044-
# TODO This currently fails due to the decoding loading
3045-
# the data (#1372)
3046-
# self.assertEqual(type(original.data), type(roundtripped.data))
3044+
self.assertEqual(type(original.data), type(actual.core_data()))
3045+
self.assertEqual(type(original.data), type(roundtripped.data))
30473046

30483047
actual.remove_coord('time')
30493048
auto_time_dimension = DataArray.from_iris(actual)

0 commit comments

Comments
 (0)