From ef9796eb3e8de81860c6f5938a2453445c90dddb Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Sun, 29 Oct 2023 12:37:13 +0100 Subject: [PATCH 1/6] Add array_api test --- xarray/tests/test_namedarray.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/xarray/tests/test_namedarray.py b/xarray/tests/test_namedarray.py index 6e39a3aa94f..307063f8caf 100644 --- a/xarray/tests/test_namedarray.py +++ b/xarray/tests/test_namedarray.py @@ -1,6 +1,8 @@ from __future__ import annotations import copy + +import warnings from collections.abc import Mapping from typing import TYPE_CHECKING, Any, Generic, cast, overload @@ -294,6 +296,18 @@ def test_duck_array_typevar(a: duckarray[Any, _DType]) -> duckarray[Any, _DType] test_duck_array_typevar(numpy_a) test_duck_array_typevar(custom_a) + # Test numpy's array api: + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + r"The numpy.array_api submodule is still experimental", + category=UserWarning, + ) + import numpy.array_api as nxp + + arraypi_a = nxp.asarray([2.1, 4], dtype=np.dtype(np.int64)) + test_duck_array_typevar(arraypi_a) + def test_new_namedarray() -> None: dtype_float = np.dtype(np.float32) From b9b0719c25e161434dc3c344c6d3b723747e1054 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 29 Oct 2023 11:38:05 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- xarray/tests/test_namedarray.py | 1 - 1 file changed, 1 deletion(-) diff --git a/xarray/tests/test_namedarray.py b/xarray/tests/test_namedarray.py index 307063f8caf..e576e96e9b9 100644 --- a/xarray/tests/test_namedarray.py +++ b/xarray/tests/test_namedarray.py @@ -1,7 +1,6 @@ from __future__ import annotations import copy - import warnings from collections.abc import Mapping from typing import TYPE_CHECKING, Any, Generic, cast, overload From c5d9d93fde2786638b59809f965550e53c3c8915 Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Sun, 29 Oct 2023 12:58:17 +0100 Subject: [PATCH 3/6] Update test_namedarray.py --- xarray/tests/test_namedarray.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xarray/tests/test_namedarray.py b/xarray/tests/test_namedarray.py index e576e96e9b9..ff8fa97c950 100644 --- a/xarray/tests/test_namedarray.py +++ b/xarray/tests/test_namedarray.py @@ -304,8 +304,10 @@ def test_duck_array_typevar(a: duckarray[Any, _DType]) -> duckarray[Any, _DType] ) import numpy.array_api as nxp - arraypi_a = nxp.asarray([2.1, 4], dtype=np.dtype(np.int64)) - test_duck_array_typevar(arraypi_a) + # TODO: nxp doesn't use dtype typevars, so can only use Any for the moment: + arrayapi_a: duckarray[Any, Any] # duckarray[Any, np.dtype[np.int64]] + arrayapi_a = nxp.asarray([2.1, 4], dtype=np.dtype(np.int64)) + test_duck_array_typevar(arrayapi_a) def test_new_namedarray() -> None: From c489741313e616450018b66005fa8a7492ba26cc Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:03:56 +0100 Subject: [PATCH 4/6] array_api doesn't have __array__ can't assume that --- xarray/namedarray/_typing.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/xarray/namedarray/_typing.py b/xarray/namedarray/_typing.py index 10314fe9440..8cfc6931431 100644 --- a/xarray/namedarray/_typing.py +++ b/xarray/namedarray/_typing.py @@ -93,14 +93,6 @@ def shape(self) -> _Shape: def dtype(self) -> _DType_co: ... - @overload - def __array__(self, dtype: None = ..., /) -> np.ndarray[Any, _DType_co]: - ... - - @overload - def __array__(self, dtype: _DType, /) -> np.ndarray[Any, _DType]: - ... - @runtime_checkable class _arrayfunction( @@ -112,6 +104,19 @@ class _arrayfunction( Corresponds to np.ndarray. """ + @overload + def __array__(self, dtype: None = ..., /) -> np.ndarray[Any, _DType_co]: + ... + + @overload + def __array__(self, dtype: _DType, /) -> np.ndarray[Any, _DType]: + ... + + def __array__( + self, dtype: _DType | None = ..., / + ) -> np.ndarray[Any, _DType] | np.ndarray[Any, _DType_co]: + ... + # TODO: Should return the same subclass but with a new dtype generic. # https://github.com/python/typing/issues/548 def __array_ufunc__( From 6dd175cd1653b3fc7d39ecc50ae3c2e07bde13ac Mon Sep 17 00:00:00 2001 From: Illviljan <14371165+Illviljan@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:05:57 +0100 Subject: [PATCH 5/6] convert .data to numpy, can't assume that array_api data will do that. --- xarray/tests/test_namedarray.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/xarray/tests/test_namedarray.py b/xarray/tests/test_namedarray.py index ff8fa97c950..73161517339 100644 --- a/xarray/tests/test_namedarray.py +++ b/xarray/tests/test_namedarray.py @@ -24,6 +24,7 @@ _DType, _Shape, duckarray, + _arrayapi, ) from xarray.namedarray.utils import Default @@ -67,13 +68,13 @@ def test_namedarray_init() -> None: expected = np.array([1, 2], dtype=dtype) actual: NamedArray[Any, np.dtype[np.int8]] actual = NamedArray(("x",), expected) - assert np.array_equal(actual.data, expected) + assert np.array_equal(np.asarray(actual.data), expected) with pytest.raises(AttributeError): expected2 = [1, 2] actual2: NamedArray[Any, Any] actual2 = NamedArray(("x",), expected2) # type: ignore[arg-type] - assert np.array_equal(actual2.data, expected2) + assert np.array_equal(np.asarray(actual2.data), expected2) @pytest.mark.parametrize( @@ -102,7 +103,7 @@ def test_from_array( else: actual = from_array(dims, data) - assert np.array_equal(actual.data, expected) + assert np.array_equal(np.asarray(actual.data), expected) def test_from_array_with_masked_array() -> None: @@ -115,7 +116,8 @@ def test_from_array_with_masked_array() -> None: def test_from_array_with_0d_object() -> None: data = np.empty((), dtype=object) data[()] = (10, 12, 12) - np.array_equal(from_array((), data).data, data) + narr = from_array((), data) + np.array_equal(np.asarray(narr.data), data) # TODO: Make xr.core.indexing.ExplicitlyIndexed pass as a subclass of_arrayfunction_or_api @@ -141,7 +143,7 @@ def test_properties() -> None: named_array: NamedArray[Any, Any] named_array = NamedArray(["x", "y"], data, {"key": "value"}) assert named_array.dims == ("x", "y") - assert np.array_equal(named_array.data, data) + assert np.array_equal(np.asarray(named_array.data), data) assert named_array.attrs == {"key": "value"} assert named_array.ndim == 2 assert named_array.sizes == {"x": 2, "y": 5} @@ -163,7 +165,7 @@ def test_attrs() -> None: def test_data(random_inputs: np.ndarray[Any, Any]) -> None: named_array: NamedArray[Any, Any] named_array = NamedArray(["x", "y", "z"], random_inputs) - assert np.array_equal(named_array.data, random_inputs) + assert np.array_equal(np.asarray(named_array.data), random_inputs) with pytest.raises(ValueError): named_array.data = np.random.random((3, 4)).astype(np.float64) @@ -182,11 +184,11 @@ def test_real_and_imag() -> None: named_array = NamedArray(["x"], arr) actual_real: duckarray[Any, np.dtype[np.float64]] = named_array.real.data - assert np.array_equal(actual_real, expected_real) + assert np.array_equal(np.asarray(actual_real), expected_real) assert actual_real.dtype == expected_real.dtype actual_imag: duckarray[Any, np.dtype[np.float64]] = named_array.imag.data - assert np.array_equal(actual_imag, expected_imag) + assert np.array_equal(np.asarray(actual_imag), expected_imag) assert actual_imag.dtype == expected_imag.dtype @@ -215,7 +217,7 @@ def test_0d_object() -> None: named_array = from_array([], (10, 12, 12)) expected_data = np.empty((), dtype=object) expected_data[()] = (10, 12, 12) - assert np.array_equal(named_array.data, expected_data) + assert np.array_equal(np.asarray(named_array.data), expected_data) assert named_array.dims == () assert named_array.sizes == {} From 15d5ae0bf92a49e25798c7944c86b2cf6c75ce55 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 29 Oct 2023 13:06:41 +0000 Subject: [PATCH 6/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- xarray/tests/test_namedarray.py | 1 - 1 file changed, 1 deletion(-) diff --git a/xarray/tests/test_namedarray.py b/xarray/tests/test_namedarray.py index 73161517339..448e8cf819a 100644 --- a/xarray/tests/test_namedarray.py +++ b/xarray/tests/test_namedarray.py @@ -24,7 +24,6 @@ _DType, _Shape, duckarray, - _arrayapi, ) from xarray.namedarray.utils import Default