Skip to content

Releases: PyWavelets/pywt


Choose a tag to compare
release v1.4.1, updating classifiers and python_requires in …


* release v1.4.1, fixing python_requires and classiers in

* drop Python 3.7 test cases

* Drop Python 3.7 tests from Appveyor as well

* Remove Python 3.7 entries in pyproject.toml

Co-authored-by: Ralf Gommers <>


Choose a tag to compare
add missing release note files

PyWavelets 1.3.0

Choose a tag to compare

We are very pleased to announce the release of PyWavelets 1.3. This release is functionally the same as 1.2.0, but we have updated the set of binary wheels provided. Specifically we have added aarch64 wheels for Python 3.7 that were missing in 1.2.0 and have updated the versions of manylinux used for the linux wheels in a manner consistent with NumPy and SciPy. We have also dropped musllinux wheels which were present for some architectures in 1.2.0. We may add them again in the future if they are adopted by NumPy and there is a demand for this architecture.

full release notes

PyWavelets 1.2.0

Choose a tag to compare

We are very pleased to announce the release of PyWavelets 1.2.

This release has new discrete wavelet transforms features incleading a series of multiresolution analysis functions (details below).

PyWavelets has dropped support for Python 3.5 and 3.6 and now supports Python 3.7-3.10.

We also now provide aarch64 linux wheels as well as universal2 and arm64 wheels that are compatible with Apple's M1 processors.

New features

  • There is a new series of multilevel stationary wavelet transforms (mra, mra2 and mran) suited for multiresolution analysis of 1D, 2D or nD signals, respectively. This MRA analysis is also known as the additive wavelet decomposition because the corresponding inverse functions (imra, imra2 or imran) reconstruct the original signal by simple addition of the components. These are a good alternative to the use of the existing SWT functions when it is important to have features aligned across wavelet scales (see the new demo in demo/

  • There is now an n-dimensional implementation available for the wavelet packet transforms (see class WaveletPacketND).

Backwards incompatible changes

  • The image returned by has been replaced by a similar, CC0-licensed image because the original image was determined to only be licensed for non-commercial use. Any users who still need the prior camera image for non-commercial use can find it many places online by performing a web search for "cameraman test image".

Bugs Fixed

  • Add input length check in dwt_single for reflect modes.
  • Demos were updated for compatibility with recent Matplotlib versions.
  • Removed deprecated import from imp.

Other changes

  • PyWavelets has dropped support for Python 3.5 and 3.6 in this release.


  • ElConno +
  • Ralf Gommers
  • Gregory R. Lee
  • Jakub Mandula +
  • nperraud +
  • ossdev07 +

A total of 6 people contributed to this release.
People with a "+" by their names contributed a patch for the first time.
This list of names is automatically generated, and may not be fully complete.

PyWavelets 1.1.1

Choose a tag to compare

This release is functionally identical to 1.1.0.

This release modified to mark the package as Python 3.5+ only so pip will not try to install 1.1.1 on older Python versions. To prevent pip from trying to install 1.1.0 on older Python, the source tarball for 1.1.0 was removed from PyPI.

PyWavelets 1.1.0

Choose a tag to compare

PyWavelets 1.1.0

.. contents::

We are very pleased to announce the release of PyWavelets 1.1.

This release includes enhanced functionality for both the stationary wavelet
transforms (swt, swt2, swtn) as well as the continuous wavelet
transform (cwt). In addition, there are a handful of bug fixes as
described in more detail below.

This release has dropped Python 2.7 support and now requires Python >= 3.5.

In addition to these changes to the software itself, a paper describing
PyWavelets was recently published in The Journal of Open Source Software:

New features

  • All swt functions now have a new trim_approx option that can be used
    to exclude the approximation coefficients from all but the final level of
    decomposition. This mode makes the output of these functions consistent with
    the format of the output from the corresponding wavedec functions.

  • All swt functions also now have a new norm option that, when set to
    True and used in combination with trim_approx=True, gives a partition
    of variance across the transform coefficients. In other words, the sum of
    the variances of all coefficients is equal to the variance of the original
    data. This partitioning of variance makes the swt transform more similar
    to the multiple-overlap DWT (MODWT) described in Percival and Walden's book,
    "Wavelet Methods for Time Series Analysis". (#476)

    A demo of this new swt functionality is available at

  • The continuous wavelet transform (cwt) now offers an FFT-based
    implementation in addition to the previous convolution based one. The new
    method argument can be set to either 'conv' or 'fft' to select
    between these two implementations. (#490).

  • The cwt now also has axis support so that CWTs can be applied in
    batch along any axis of an n-dimensional array. This enables faster batch
    transformation of signals. (#509)

Backwards incompatible changes

  • When the input to cwt is single precision, the computations are now
    performed in single precision. This was done both for efficiency and to make
    cwt handle dtypes consistently with the discrete transforms in
    PyWavelets. This is a change from the prior behaviour of always performing
    the cwt in double precision. (#507)

  • When using complex-valued wavelets with the cwt, the output will now be
    the complex conjugate of the result that was produced by PyWavelets 1.0.x.
    This was done to account for a bug described below. The magnitude of the
    cwt coefficients will still match those from previous releases. (#439)

Bugs Fixed

  • For a cwt with complex wavelets, the results in PyWavelets 1.0.x releases
    matched the output of Matlab R2012a's cwt. Howveer, older Matlab releases
    like R2012a had a phase that was of opposite sign to that given in textbook
    definitions of the CWT (Eq. 2 of Torrence and Compo's review article, "A
    Practical Guide to Wavelet Analysis"). Consequently, the wavelet coefficients
    were the complex conjugates of the expected result. This was validated by
    comparing the results of a transform using cmor1.0-1.0 as compared to the
    cwt implementation available in Matlab R2017b as well as the function
    wt.m from the Lancaster University Physics department's
    MODA toolbox <>_. (#439)

  • For some boundary modes and data sizes, round-trip dwt/idwt can
    result in an output that has one additional coefficient. Prior to this
    relese, this could cause a failure during WaveletPacket or
    WaveletPacket2D reconstruction. These wavelet packet transforms have now
    been fixed and round-trip wavelet packet transforms always preserve the
    original data shape. (#448)

  • All inverse transforms now handle mixed precision coefficients consistently.
    Prior to this release some inverse transform raised an error upon
    encountering mixed precision dtypes in the wavelet subbands. In release 1.1,
    when the user-provided coefficients are a mixture of single and double
    precision, all coefficients will be promoted to double precision. (#450)

  • A bug that caused a failure for iswtn when using user-provided axes
    with non-uniform shape along the transformed axes has been fixed. (#462)

Other changes

  • The PyWavelet test suite now uses pytest rather than nose. (#477)

  • Cython code has been updated to use language_level=3. (#435)

  • PyWavelets has adopted the SciPy Code of Conduct. (#521)

PyWavelets v1.0.3

Choose a tag to compare

PyWavelets 1.0.3 is functionally equivalent to the 1.0.2 release. It was made to archive the JOSS paper about PyWavelets to the 1.0.x branch and serve as a reference corresponding to the version that was peer reviewed.

PyWavelets v1.0.2

Choose a tag to compare

PyWavelets 1.0.2 is a bug-fix and maintenance release with no new features
compared to 1.0.1.

Bugs Fixed

A bug in iswtn when using some combinations of user-specified axes was fixed.

A potential error related to coefficient shape mismatch during WaveletPacket
or WaveletPacket2D reconstruction was fixed.

Other Changes

A deprecated import of Iterable was fixed.

The spelling of "Garrote" was fixed in the wavelet thresholding documentation. For backwards compatibility with 1.0.0, the incorrect ("garotte") spelling is also accepted for the mode parameter of pywt.threshold.

The spelling of "supported" was fixed in one of the ValueError messages that can be returned by pywt.cwt.

Cython language compatibility has been pinned to language_level = '2'. This is in contrast to the master branch which is now using language_level = '3'. To support this, the minimum supported Cython version
has been raised to 0.23.5.

PyWavelets v1.0.1

Choose a tag to compare

PyWavelets 1.0.1 is a bug-fix release with no new features compared to 1.0.0.

Bugs Fixed

Key-based assignment of coefficients to a FswavedecnResult object (i.e. via
its setitem method) has been fixed.

The order that the individual subband coefficients were stacked by the
function pywt.ravel_coeffs is now guaranteed to be consistent across all
supported Python versions. Explicit alphabetic ordering of subband coefficient
names is used for consitent ordering regardless of Python version.

PyWavelets v1.0.0

Choose a tag to compare

PyWavelets 1.0.0 Release Notes

We are very pleased to announce the release of PyWavelets 1.0. We view this version number as a milestone in the project's now more than a decade long history. It reflects that PyWavelets has stabilized over the past few years, and is now a mature package which a lot of other important packages depend on. A listing of those package won't be complete, but some we are aware of are:

  • scikit-image - image processing in Python
  • imagehash - perceptual image hashing
  • pyradiomics - extraction of Radiomics features from 2D and 3D images and binary masks
  • tomopy - Tomographic Reconstruction in Python
  • SpikeSort - Spike sorting library implemented in Python/NumPy/PyTables
  • ODL - operator discretization library

This release requires Python 2.7 or >=3.5 and NumPy 1.9.1 or greater. The 1.0 release will be the last release supporting Python 2.7. It will be a Long Term Support (LTS) release, meaning that we will backport critical bug
fixes to 1.0.x for as long as Python itself does so (i.e. until 1 Jan 2020).

New features

New 1D test signals

Many common synthetic 1D test signals have been implemented in the new function to encourage reproducible research. To get a list of the available signals, call'list').
These signals have been validated to match the test signals of the same name from the Wavelab toolbox (with the kind permission of Dr. David Donoho).

C99 complex support

The Cython modules and underlying C library can now be built with C99 complex support when supported by the compiler. Doing so improves performance when running wavelet transforms on complex-valued data. On POSIX systems (Linux, Mac OS X), C99 complex support is enabled by default at build time. The user can set the environment variable USE_C99_COMPLEX to 0 or 1 to manually disable or enable C99 support at compile time.

complex-valued CWT

The continuous wavelet transform, cwt, now also accepts complex-valued data.

More flexible specification of some continuous wavelets

The continous wavelets "cmor", "shan" and "fbsp" now let the user specify attributes such as their center frequency and bandwidth that were previously fixed. See more on this in the section on deprecated features.

Fully Separable Discrete Wavelet Transfrom

A new variant of the multilevel n-dimensional DWT has been implemented. It is known as the fully separable wavelet transform (FSWT). The functions fswavedecn fswaverecn correspond to the forward and inverse transforms, respectively. This differs from the existing wavedecn and waverecn in dimensions >= 2 in that all levels of decomposition are performed along a single axis prior to moving on to the next.

New thresholding methods

pywt.threshold now supports non-negative Garotte thresholding (mode='garotte'). There is also a new function pywt.threshold_firm that implements firm (semi-soft) thresholding. Both of the these new thresholding methods are intermediate between soft and hard thresholding.

New anti-symmetric boundary modes

Two new boundary handling modes for the discrete wavelet transforms have been implemented. These correspond to whole-sample and half-sample anti-symmetric boundary conditions (antisymmetric and antireflect).

New functions to ravel and unravel wavedecn coefficients

The function ravel_coeffs can be used to ravel all coefficients from wavedec, wavedec2 or wavedecn into a single 1D array. Unraveling back into a list of individual n-dimensional coefficients can be performed by

New functions to determine multilevel DWT coefficient shapes and sizes

The new function wavedecn_size outputs the total number of coefficients that will be produced by a wavedecn decomposition. The function wavedecn_shapes returns full shape information for all coefficient arrays produced by wavedecn. These functions provide the size/shape information without having to explicitly compute a transform.

Deprecated features

The continous wavelets with names "cmor", "shan" and "fbsp" should now be modified to include formerly hard-coded attributes such as their center frequency and bandwidth. Use of the bare names "cmor". "shan" and "fbsp" is now deprecated. For "cmor" (and "shan"), the form of the wavelet name is now "cmorB-C" ("shanB-C") where B and C are floats representing the bandwidth frequency and center frequency. For "fbsp" the form should now incorporate three floats as in "fbspM-B-C" where M is the spline order and B and C are the bandwidth and center frequencies.

Backwards incompatible changes

Python 2.6, 3.3 and 3.4 are no longer supported.

The order of coefficients returned by swt2 and input to iswt2 have been reversed so that the decomposition levels are now returned in descending rather than ascending order. This makes these 2D stationary wavelet functions consistent with all of the other multilevel discrete transforms in PyWavelets.

For wavedec, wavedec2 and wavedecn, the ability for the user to specify a level that is greater than the value returned by dwt_max_level has been restored. A UserWarning is raised instead of a ValueError in this case.

Bugs Fixed

Assigning new data to the Node or Node2D no longer forces a cast to float64 when the data is one of the other dtypes supported by the dwt (float32, complex64, complex128).

Calling pywt.threshold with mode='soft' now works properly for complex-valued inputs.

A segfault when running multiple swt2 or swtn transforms concurrently has been fixed.

Several instances of deprecated numpy multi-indexing that caused warnings in numpy >=1.15 have been resolved.

The 2d inverse stationary wavelet transform, iswt2, now supports non-square inputs (an unnecessary check for square inputs was removed).

Wavelet packets no longer convert float32 to float64 upon assignment to nodes.

Doctests have been updated to also work with NumPy >= 1.14,

Indexing conventions have been updated to avoid FutureWarnings in NumPy 1.15.

Other changes

Python 3.7 is now officially supported.


  • 0-tree +
  • Jacopo Antonello +
  • Matthew Brett +
  • Saket Choudhary +
  • Michael V. DePalatis +
  • Daniel Goertzen +
  • Ralf Gommers
  • Mark Harfouche +
  • John Kirkham +
  • Dawid Laszuk +
  • Gregory R. Lee
  • Michel Pelletier +
  • Balint Reczey +
  • SylvainLan +
  • Daniele Tricoli
  • Kai Wohlfahrt

A total of 16 people contributed to this release.
People with a "+" by their names contributed a patch for the first time.
This list of names is automatically generated, and may not be fully complete.