From 3b4ddaaeb3b9331fc83e17276f19dfb63c20b765 Mon Sep 17 00:00:00 2001 From: brokkoli71 Date: Tue, 4 Jun 2024 11:34:43 +0200 Subject: [PATCH 1/4] test and fix transpose codec for non self inverse orders --- tests/test_v3.py | 18 ++++++++++++++++++ zarrita/codecs.py | 4 +--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/test_v3.py b/tests/test_v3.py index 8be4bfb..4af376d 100644 --- a/tests/test_v3.py +++ b/tests/test_v3.py @@ -456,6 +456,24 @@ async def test_transpose( ) +def test_transpose_non_self_inverse( + store: Store +): + data = np.arange(0, 6 * 7 * 8, dtype="uint16").reshape((6, 7, 8)) + order = [1, 2, 0] + a = Array.create( + store / "transpose_non_self_inverse", + shape=data.shape, + chunk_shape=(6, 7, 8), + dtype=data.dtype, + fill_value=0, + codecs=[codecs.transpose_codec(order), codecs.bytes_codec()], + ) + a[:, :] = data + read_data = a[:, :] + assert np.array_equal(data, read_data) + + def test_transpose_invalid( store: Store, ): diff --git a/zarrita/codecs.py b/zarrita/codecs.py index 13e1e3a..29d2f54 100644 --- a/zarrita/codecs.py +++ b/zarrita/codecs.py @@ -426,9 +426,7 @@ async def decode( self, chunk_array: np.ndarray, ) -> np.ndarray: - inverse_order = [0 for _ in range(self.array_metadata.ndim)] - for x, i in enumerate(self.order): - inverse_order[x] = i + inverse_order = np.argsort(self.order) chunk_array = chunk_array.transpose(inverse_order) return chunk_array From 9ed2630f11c25cad8d0649216435f1adde17e587 Mon Sep 17 00:00:00 2001 From: brokkoli71 Date: Tue, 4 Jun 2024 11:42:49 +0200 Subject: [PATCH 2/4] add more testcases to test_transpose_non_self_inverse --- tests/test_v3.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/test_v3.py b/tests/test_v3.py index 4af376d..1b7c735 100644 --- a/tests/test_v3.py +++ b/tests/test_v3.py @@ -455,16 +455,17 @@ async def test_transpose( "transpose_zarr/0.0" ) - +@pytest.mark.parametrize("order", [[1, 2, 0], [1, 2, 3, 0], [3, 2, 4, 0, 1]]) def test_transpose_non_self_inverse( - store: Store + store: Store, + order ): - data = np.arange(0, 6 * 7 * 8, dtype="uint16").reshape((6, 7, 8)) - order = [1, 2, 0] + shape = [i+3 for i in range(len(order))] + data = np.arange(0, np.prod(shape), dtype="uint16").reshape(shape) a = Array.create( store / "transpose_non_self_inverse", shape=data.shape, - chunk_shape=(6, 7, 8), + chunk_shape=shape, dtype=data.dtype, fill_value=0, codecs=[codecs.transpose_codec(order), codecs.bytes_codec()], From 3f44fd84da532379532925c6ba4c99236ef6f287 Mon Sep 17 00:00:00 2001 From: brokkoli71 Date: Tue, 4 Jun 2024 11:55:25 +0200 Subject: [PATCH 3/4] fix incompatible arg-type in test_transpose_non_self_inverse --- tests/test_v3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_v3.py b/tests/test_v3.py index 1b7c735..b556352 100644 --- a/tests/test_v3.py +++ b/tests/test_v3.py @@ -465,7 +465,7 @@ def test_transpose_non_self_inverse( a = Array.create( store / "transpose_non_self_inverse", shape=data.shape, - chunk_shape=shape, + chunk_shape=data.shape, dtype=data.dtype, fill_value=0, codecs=[codecs.transpose_codec(order), codecs.bytes_codec()], From 46e8722653df35ac5ac124eb8c2263976c22d095 Mon Sep 17 00:00:00 2001 From: brokkoli71 Date: Tue, 4 Jun 2024 12:00:29 +0200 Subject: [PATCH 4/4] reformat with black --- tests/test_v3.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/test_v3.py b/tests/test_v3.py index b556352..5579830 100644 --- a/tests/test_v3.py +++ b/tests/test_v3.py @@ -455,12 +455,10 @@ async def test_transpose( "transpose_zarr/0.0" ) + @pytest.mark.parametrize("order", [[1, 2, 0], [1, 2, 3, 0], [3, 2, 4, 0, 1]]) -def test_transpose_non_self_inverse( - store: Store, - order -): - shape = [i+3 for i in range(len(order))] +def test_transpose_non_self_inverse(store: Store, order): + shape = [i + 3 for i in range(len(order))] data = np.arange(0, np.prod(shape), dtype="uint16").reshape(shape) a = Array.create( store / "transpose_non_self_inverse",