From a4c000d5b640991ae831f66159356dd18e5bc690 Mon Sep 17 00:00:00 2001 From: Davis Vann Bennett Date: Wed, 30 Apr 2025 19:16:07 +0200 Subject: [PATCH 1/3] index with an empty tuple to get scalar --- src/zarr/core/buffer/core.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/zarr/core/buffer/core.py b/src/zarr/core/buffer/core.py index 1318f868a0..cfcd7e6633 100644 --- a/src/zarr/core/buffer/core.py +++ b/src/zarr/core/buffer/core.py @@ -427,16 +427,7 @@ def as_scalar(self) -> ScalarType: """Returns the buffer as a scalar value""" if self._data.size != 1: raise ValueError("Buffer does not contain a single scalar value") - item = self.as_numpy_array().item() - scalar: ScalarType - - if np.issubdtype(self.dtype, np.datetime64): - unit: str = np.datetime_data(self.dtype)[0] # Extract the unit (e.g., 'Y', 'D', etc.) - scalar = np.datetime64(item, unit) - else: - scalar = self.dtype.type(item) # Regular conversion for non-datetime types - - return scalar + return cast(ScalarType, self.as_numpy_array()[()]) @property def dtype(self) -> np.dtype[Any]: From 1a83742ba59f130c3ba4faa1b63de5256cb11268 Mon Sep 17 00:00:00 2001 From: Davis Vann Bennett Date: Thu, 1 May 2025 10:54:56 +0200 Subject: [PATCH 2/3] changelog --- changes/3027.misc.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 changes/3027.misc.rst diff --git a/changes/3027.misc.rst b/changes/3027.misc.rst new file mode 100644 index 0000000000..ffbfe9b808 --- /dev/null +++ b/changes/3027.misc.rst @@ -0,0 +1 @@ +Simplified scalar indexing of size-1 arrays. \ No newline at end of file From b6fda23153392de5d4ce4bb62e1fbeebb97fce34 Mon Sep 17 00:00:00 2001 From: Davis Vann Bennett Date: Thu, 1 May 2025 11:26:09 +0200 Subject: [PATCH 3/3] add as_scalar test --- tests/test_buffer.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_buffer.py b/tests/test_buffer.py index 33ac0266eb..73b3a16677 100644 --- a/tests/test_buffer.py +++ b/tests/test_buffer.py @@ -155,3 +155,9 @@ def test_numpy_buffer_prototype() -> None: assert isinstance(ndbuffer.as_ndarray_like(), np.ndarray) with pytest.raises(ValueError, match="Buffer does not contain a single scalar value"): ndbuffer.as_scalar() + + +# TODO: the same test for other buffer classes +def test_cpu_buffer_as_scalar() -> None: + buf = cpu.buffer_prototype.nd_buffer.create(shape=(), dtype="int64") + assert buf.as_scalar() == buf.as_ndarray_like()[()] # type: ignore[index]