PyWavelets - Wavelet Transforms in Python
PyWavelets 1.0.2 is a bug-fix and maintenance release with no new features compared to 1.0.1.
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.
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 1.0.1 is a bug-fix release with no new features compared to 1.0.0.
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.
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:
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).
Many common synthetic 1D test signals have been implemented in the new function pywt.data.demo_signals
to encourage reproducible research. To get a list of the available signals, call pywt.data.demo_signals('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).
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.
The continuous wavelet transform, cwt
, now also accepts complex-valued data.
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.
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.
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.
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
).
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
unravel_coeffs
.
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.
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.
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.
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.
Python 3.7 is now officially supported.
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.
PyWavelets 0.5.2 is a bug-fix release with no new features compared to 0.5.1.
The pywt.data.nino
data reader is now compatible with numpy 1.12. (#273)
The wp_scalogram.py
demo is now compatibile with matplotlib 2.0. (#276)
Fixed a sporadic segmentation fault affecting stationary wavelet transforms of multi-dimensional data. (#289)
idwtn
now treats coefficients set to None to be treated as zeros (#291).
This makes the behavior consistent with its docstring as well as idwt2.
Previously this raised an error.
The tests are now included when installing from wheels or when running
python setup.py install
. (#292)
A bug leading to a potential RuntimeError
was fixed in waverec
.
This bug only affected transforms where the data was >1D and the transformed
axis was not the first axis of the array. (#294).
PyWavelets 0.5.1 is a bug-fix release with no new features compared to 0.5.0
In release 0.5.0 the wrong edge mode was used for the following three
deprecated modes: ppd
, sp1
, and per
. All deprecated edge mode
names are now correctly converted to the corresponding new names.
One-dimensional discrete wavelet transforms did not properly respect the
axis
argument for complex-valued data. Prior to this release, the last
axis was always transformed for arrays with complex dtype. This fix affects
dwt
, idwt
, wavedec
, waverec
.
PyWavelets is a Python toolbox implementing both discrete and continuous wavelet transforms (mathematical time-frequency transforms) with a wide range of built-in wavelets. C/Cython are used for the low-level routines, enabling high performance. Key Features of PyWavelets are:
PyWavelets 0.5.0 is the culmination of 1 year of work. In addition to several new features, substantial refactoring of the underlying C and Cython code have been made.
This release requires Python 2.6, 2.7 or 3.3-3.5 and NumPy 1.9.1 or greater. This will be the final release supporting Python 2.6 and 3.3.
Highlights of this release include:
A wide range of continous wavelets are now available. These include the following:
gaus1
...gaus8
)mexh
)morl
)cgau1
...cgau8
)shan
)fbsp
)cmor
)Also, see the new CWT-related demo: demo/cwt_analysis.py
Additional Debauchies wavelets (db20
...db38
) and Coiflets
(coif6
...coif17
) have been added.
Discrete wavelet transforms support a new extension mode, reflect
. This
mode pads an array symmetrically, but without repeating the edge value. As an
example::
pad array pad
4 3 2 | 1 2 3 4 5 | 4 3 2
This differs from symmetric
, which repeats the values at the boundaries::
pad array pad
3 2 1 | 1 2 3 4 5 | 5 4 3
New routines to convert the coefficients returned by multilevel DWT routines
to and from a single n-dimensional array have been added.
pywt.coeffs_to_array
concatenates the output of wavedec
, wavedec2
or wavedecn
into a single numpy array. pywt.array_to_coeffs
can be
used to transform back from a single coefficient array to a format appropriate
for waverec
, waverec2
or waverecn
.
Cython code calling the wavelet filtering routines (DWT and SWT) now releases the global interpreter lock (GIL) where possible. A potential use case is in speeding up the batch computation of several large DWTs using multi-threading (e.g. via concurrent.futures).
The axis specific transform support introduced in the prior release was
extended to the multilevel DWT transforms. All wavedec*
and waverec*
routines have a new axis
(1D) or axes
(2D, nD) keyword argument. If
unspecified the default behaviour is to transform all axes of the input.
Stationary wavelet transforms are now faster when the number of levels is greater than one. The improvement can be very large (multiple orders of magnitude) for transforms with a large number of levels.
A FutureWarning was added to swt2
and iswt2
to warn about a pending
backwards incompatible change to the order of the coefficients in the list
returned by these routines. The actual change will not occur until the next
release. Transform coefficients will be returned in descending rather than
ascending order. This change is being made for consistency with all other
existing multi-level transforms in PyWavelets.
demo/image_blender.py
was updated to support the new api of Pillow 3.x
A bug related to size of assumed size_t
on some platforms/compilers
(e.g. Windows with mingw64) was fixed.
Fix to memory leak in (i)dwt_axis
Fix to a performance regression in idwt
and iswt
that was introduced
in v0.4.0.
Fixed a bug in dwtn
and idwtn
for data with complex dtype when
axes != None
.
The minimum supported numpy version has been increased to 1.9.1.
Test coverage (including for the Cython and C code) via
Codecov <https://codecov.io/>
_ was added and the overall test coverage has
been improved.
A substantial overhaul of the C extension code has been performed. Custom templating is no longer used. The intention is to make this code easier to maintain and expand in the future.
The Cython code has been split out into a multiple files to hopefully make relevant portions of the wrappers easier to find for future developers.
setup.py
now relies on setuptools in all cases (rather than distutils).
A total of 10 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.
Issues closed in this release: see here
Pull requests merged in this release: see here
PyWavelets 0.4.0 is the culmination of 6 months of work. In addition to several new features, some changes and deprecations have been made to streamline the API.
This release requires Python 2.6, 2.7 or 3.3-3.5 and NumPy 1.6.2 or greater.
Highlights of this release include:
1D (iswt
) and 2D (iswt2
) inverse stationary wavelet transforms were
added. These currently only support even length inputs.
The multidimensional DWT and IDWT code was refactored and is now an order of
magnitude faster than in previous releases. The following functions benefit:
dwt2
, idwt2
, dwtn
, idwtn
.
64 and 128-bit complex data types are now supported by all wavelet transforms.
The existing 1D and 2D multilevel transforms were supplemented with an nD implementation.
All wavelet transform functions now support explicit specification of the axis or axes upon which to perform the transform.
Two additional 2D grayscale images were added (camera
, ascent
). The
previously existing 1D ECG data (ecg
) and the 2D aerial image (aero
)
used in the demos can also now be imported via functions defined in
pywt.data
(e.g. camera = pywt.data.camera()
)
A number of functions have been renamed, the old names are deprecated and will be removed in a future release:
intwave
, renamed to integrate_wavelet
centrfrq
, renamed to central_frequency
scal2frq
, renamed to scale2frequency
orthfilt
, renamed to orthogonal_filter_bank
Integration of general signals (i.e. not wavelets) with integrate_wavelet
is deprecated.
The MODES
object and its attributes are deprecated. The new name is
Modes
, and the attribute names are expanded:
zpd
, renamed to zero
cpd
, renamed to constant
sp1
, renamed to smooth
sym
, renamed to symmetric
ppd
, renamed to periodic
per
, renamed to periodization
idwt
no longer takes a correct_size
parameter. As a consequence,
idwt2
inputs must match exactly in length. For multilevel transforms, where
arrays differing in size by one element may be produced, use the waverec
functions from the multilevel
module instead.
float32 inputs were not always respected. All transforms now return float32 outputs when called using float32 inputs.
Incorrect detail coefficients were returned by downcoef
when level > 1
.
Much of the API documentation is now autogenerated from the corresponding function docstrings. The numpydoc sphinx extension is now needed to build the documentation.
A total of 8 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.
Issues closed in this release: see here
Pull requests merged in this release: see here
PyWavelets 0.3.0 is the first release of the package in 3 years. It is the result of a significant effort of a growing development team to modernize the package, to provide Python 3.x support and to make a start with providing new features as well as improved performance. A 0.4.0 release will follow shortly, and will contain more significant new features as well as changes/deprecations to streamline the API.
This release requires Python 2.6, 2.7 or 3.3-3.5 and NumPy 1.6.2 or greater.
Highlights of this release include:
The test suite can be run with nosetests pywt
or with::
>>> import pywt
>>> pywt.test()
The function pywt.idwtn
, which provides n-dimensional inverse DWT, has been
added. It complements idwt
, idwt2
and dwtn
.
The function pywt.threshold
has been added. It unifies the four thresholding
functions that are still provided in the pywt.thresholding
namespace.
None in this release.
Development has moved to a new repo <https://github.com/PyWavelets/pywt>
_.
Everyone with an interest in wavelets is welcome to contribute!
Building wheels, building with python setup.py develop
and many other
standard ways to build and install PyWavelets are supported now.
A total of 9 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.
Issues closed in this release: see here
Pull requests merged in this release: see here