From 3f66d04c04be90c46cbb4bdfdaa84c367582d79c Mon Sep 17 00:00:00 2001 From: vera-rubin <322284620+vera-rubin@users.noreply.github.com> Date: Wed, 14 Oct 2026 18:52:35 +0000 Subject: [PATCH] BUG: preserve dtypes when assigning wavelet packet nodes --- pywt/_wavelet_packets.py | 5 ++--- pywt/tests/test_wp.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pywt/_wavelet_packets.py b/pywt/_wavelet_packets.py index 787df4431..60878b8a6 100644 --- a/pywt/_wavelet_packets.py +++ b/pywt/_wavelet_packets.py @@ -295,9 +295,8 @@ def __setitem__(self, path, data): subnode[path[self.PART_LEN:]] = data else: if isinstance(data, BaseNode): - self.data = np.asarray(data.data) - else: - self.data = np.asarray(data) + data = data.data + self.data = np.asarray(data) # convert data to nearest supported dtype dtype = _check_dtype(data) if self.data.dtype != dtype: diff --git a/pywt/tests/test_wp.py b/pywt/tests/test_wp.py index 9bcd12302..52ea8e317 100644 --- a/pywt/tests/test_wp.py +++ b/pywt/tests/test_wp.py @@ -4,6 +4,7 @@ import pickle import numpy as np +import pytest from numpy.testing import assert_, assert_allclose, assert_equal, assert_raises import pywt @@ -198,6 +199,29 @@ def test_wavelet_packet_dtypes(): assert_allclose(r, x.astype(transform_dtype), atol=1e-5, rtol=1e-5) +@pytest.mark.parametrize('packet_class, shape, kwargs', [ + (pywt.WaveletPacket, (2,), {}), + (pywt.WaveletPacket2D, (2, 2), {}), + (pywt.WaveletPacketND, (2, 2, 2), {'axes': (0, 1, 2)}), +]) +@pytest.mark.parametrize('dtype', [np.float32, np.float64, + np.complex64, np.complex128]) +@pytest.mark.parametrize('mode', ['symmetric', 'periodization']) +def test_wavelet_packet_node_assignment(packet_class, shape, kwargs, dtype, mode): + x = np.arange(1, np.prod(shape) + 1, dtype=dtype).reshape(shape) + if np.iscomplexobj(x): + x += 1j * (x + 1) + wp = packet_class(x, 'haar', mode=mode, maxlevel=1, **kwargs) + new_wp = packet_class(None, 'haar', mode=mode, maxlevel=1, **kwargs) + + for node in wp.get_level(1): + new_wp[node.path] = node + assert_equal(new_wp[node.path].data.dtype, node.data.dtype) + assert_equal(new_wp[node.path].data, node.data) + + assert_allclose(new_wp.reconstruct(), x, atol=1e-6, rtol=1e-6) + + def test_db3_roundtrip(): original = np.arange(512) wp = pywt.WaveletPacket(data=original, wavelet='db3', mode='smooth',