diff --git a/doc/whats-new.rst b/doc/whats-new.rst index c435b9c042a..b033e04687c 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -42,7 +42,9 @@ Bug Fixes - Fix :py:func:`decode_cf` failing on integer-encoded time arrays that contain NaT when running against numpy 2.5+. By `Ian Hunt-Isaak `_. - +- Fix ``TypeError: Implicit conversion to a NumPy array is not allowed`` when trying to + use :py:func:`open_mfdataset` with a backend engine reading to CuPy arrays. + By `Wei Ji Leong `_. Documentation ~~~~~~~~~~~~~ diff --git a/xarray/core/indexing.py b/xarray/core/indexing.py index bb12704e55c..7884c7bd74a 100644 --- a/xarray/core/indexing.py +++ b/xarray/core/indexing.py @@ -35,7 +35,12 @@ to_0d_array, ) from xarray.namedarray.parallelcompat import get_chunked_array_type -from xarray.namedarray.pycompat import array_type, integer_types, is_chunked_array +from xarray.namedarray.pycompat import ( + array_type, + integer_types, + is_chunked_array, + to_numpy, +) if TYPE_CHECKING: from xarray.core.extension_array import PandasExtensionArray @@ -683,9 +688,10 @@ def __array__( self, dtype: DTypeLike | None = None, /, *, copy: bool | None = None ) -> np.ndarray: if Version(np.__version__) >= Version("2.0.0"): - return np.asarray(self.get_duck_array(), dtype=dtype, copy=copy) + return np.asarray(to_numpy(self.get_duck_array()), dtype=dtype, copy=copy) + else: - return np.asarray(self.get_duck_array(), dtype=dtype) + return np.asarray(to_numpy(self.get_duck_array()), dtype=dtype) def get_duck_array(self): return self.array.get_duck_array() diff --git a/xarray/namedarray/pycompat.py b/xarray/namedarray/pycompat.py index 5832f7cc9e7..a192930cea7 100644 --- a/xarray/namedarray/pycompat.py +++ b/xarray/namedarray/pycompat.py @@ -97,7 +97,7 @@ def is_0d_dask_array(x: duckarray[Any, Any]) -> bool: def to_numpy( - data: duckarray[Any, Any], **kwargs: dict[str, Any] + data: duckarray[Any, Any], **kwargs: Any ) -> np.ndarray[Any, np.dtype[Any]]: from xarray.core.indexing import ExplicitlyIndexed from xarray.namedarray.parallelcompat import get_chunked_array_type diff --git a/xarray/tests/test_indexing.py b/xarray/tests/test_indexing.py index 6b0fcd2f59a..891bbbe2da6 100644 --- a/xarray/tests/test_indexing.py +++ b/xarray/tests/test_indexing.py @@ -902,6 +902,14 @@ def test_implicit_indexing_adapter_copy_on_write() -> None: assert isinstance(implicit[:], indexing.ImplicitToExplicitIndexingAdapter) +def test_implicit_indexing_adapter_duck_array() -> None: + array = DuckArrayWrapper(array=np.arange(10)) + implicit = indexing.ImplicitToExplicitIndexingAdapter( + indexing.ArrayApiIndexingAdapter(array), indexing.BasicIndexer + ) + np.testing.assert_array_equal(np.asarray(implicit), np.arange(10)) + + def test_outer_indexer_consistency_with_broadcast_indexes_vectorized() -> None: def nonzero(x): if isinstance(x, np.ndarray) and x.dtype.kind == "b":