diff --git a/tests/test_v3.py b/tests/test_v3.py index 8be4bfb..5579830 100644 --- a/tests/test_v3.py +++ b/tests/test_v3.py @@ -456,6 +456,23 @@ async def test_transpose( ) +@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))] + data = np.arange(0, np.prod(shape), dtype="uint16").reshape(shape) + a = Array.create( + store / "transpose_non_self_inverse", + shape=data.shape, + chunk_shape=data.shape, + 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