1============================== 2PyWavelets 1.0.0 Release Notes 3============================== 4 5.. contents:: 6 7We are very pleased to announce the release of PyWavelets 1.0. We view this 8version number as a milestone in the project's now more than a decade long 9history. It reflects that PyWavelets has stabilized over the past few years, 10and is now a mature package which a lot of other important packages depend on. 11A listing of those package won't be complete, but some we are aware of are: 12 13- `scikit-image <https://scikit-image.org>`_ - image processing in Python 14- `imagehash <https://github.com/JohannesBuchner/imagehash>`_ - perceptual image hashing 15- `pyradiomics <https://github.com/Radiomics/pyradiomics>`_ - extraction of Radiomics features from 2D and 3D images and binary masks 16- `tomopy <https://github.com/tomopy/tomopy>`_ - Tomographic Reconstruction in Python 17- `SpikeSort <https://github.com/btel/SpikeSort>`_ - Spike sorting library implemented in Python/NumPy/PyTables 18- `ODL <https://github.com/odlgroup/odl>`_ - operator discretization library 19 20This release requires Python 2.7 or >=3.5 and NumPy 1.9.1 or greater. 21The 1.0 release will be the last release supporting Python 2.7. It will be a 22Long Term Support (LTS) release, meaning that we will backport critical bug 23fixes to 1.0.x for as long as Python itself does so (i.e. until 1 Jan 2020). 24 25 26New features 27============ 28 29New 1D test signals 30------------------- 31Many common synthetic 1D test signals have been implemented in the new 32function ``pywt.data.demo_signals`` to encourage reproducible research. To get 33a list of the available signals, call ``pywt.data.demo_signals('list')``. 34These signals have been validated to match the test signals of the same name 35from the `Wavelab <https://statweb.stanford.edu/~wavelab>`_ toolbox (with the 36kind permission of Dr. David Donoho). 37 38C99 complex support 39------------------- 40The Cython modules and underlying C library can now be built with C99 complex 41support when supported by the compiler. Doing so improves performance when 42running wavelet transforms on complex-valued data. On POSIX systems 43(Linux, Mac OS X), C99 complex support is enabled by default at build time. 44The user can set the environment variable ``USE_C99_COMPLEX`` to 0 or 1 to 45manually disable or enable C99 support at compile time. 46 47complex-valued CWT 48------------------ 49The continuous wavelet transform, ``cwt``, now also accepts complex-valued 50data. 51 52More flexible specification of some continuous wavelets 53------------------------------------------------------- 54The continous wavelets ``"cmor"``, ``"shan"`` and ``"fbsp"`` now let the user 55specify attributes such as their center frequency and bandwidth that were 56previously fixed. See more on this in the section on deprecated features. 57 58Fully Separable Discrete Wavelet Transfrom 59------------------------------------------ 60A new variant of the multilevel n-dimensional DWT has been implemented. It is 61known as the fully separable wavelet transform (FSWT). The functions 62``fswavedecn`` ``fswaverecn`` correspond to the forward and inverse transforms, 63respectively. This differs from the existing ``wavedecn`` and ``waverecn`` in 64dimensions >= 2 in that all levels of decomposition are performed along a 65single axis prior to moving on to the next. 66 67New thresholding methods 68------------------------ 69``pywt.threshold`` now supports non-negative Garotte thresholding 70(``mode='garotte'``). There is also a new function ``pywt.threshold_firm`` 71that implements firm (semi-soft) thresholding. Both of the these new 72thresholding methods are intermediate between soft and hard thresholding. 73 74New anti-symmetric boundary modes 75--------------------------------- 76Two new boundary handling modes for the discrete wavelet transforms have been 77implemented. These correspond to whole-sample and half-sample anti-symmetric 78boundary conditions (``antisymmetric`` and ``antireflect``). 79 80New functions to ravel and unravel wavedecn coefficients 81-------------------------------------------------------- 82The function ``ravel_coeffs`` can be used to ravel all coefficients from 83``wavedec``, ``wavedec2`` or ``wavedecn`` into a single 1D array. Unraveling 84back into a list of individual n-dimensional coefficients can be performed by 85``unravel_coeffs``. 86 87New functions to determine multilevel DWT coefficient shapes and sizes 88---------------------------------------------------------------------- 89The new function ``wavedecn_size`` outputs the total number of coefficients 90that will be produced by a ``wavedecn`` decomposition. The function 91``wavedecn_shapes`` returns full shape information for all coefficient arrays 92produced by ``wavedecn``. These functions provide the size/shape information 93without having to explicitly compute a transform. 94 95Deprecated features 96=================== 97 98The continous wavelets with names ``"cmor"``, ``"shan"`` and ``"fbsp"`` 99should now be modified to include formerly hard-coded attributes such as their 100center frequency and bandwidth. Use of the bare names "cmor". "shan" and 101"fbsp" is now deprecated. For "cmor" (and "shan"), the form of the wavelet 102name is now "cmorB-C" ("shanB-C") where B and C are floats representing the 103bandwidth frequency and center frequency. For "fbsp" the form should now 104incorporate three floats as in "fbspM-B-C" where M is the spline order and B 105and C are the bandwidth and center frequencies. 106 107 108Backwards incompatible changes 109============================== 110 111Python 2.6, 3.3 and 3.4 are no longer supported. 112 113The order of coefficients returned by ``swt2`` and input to ``iswt2`` have been 114reversed so that the decomposition levels are now returned in descending rather 115than ascending order. This makes these 2D stationary wavelet functions 116consistent with all of the other multilevel discrete transforms in PyWavelets. 117 118For ``wavedec``, ``wavedec2`` and ``wavedecn``, the ability for the user to 119specify a ``level`` that is greater than the value returned by 120``dwt_max_level`` has been restored. A ``UserWarning`` is raised instead of a 121``ValueError`` in this case. 122 123Bugs Fixed 124========== 125 126Assigning new data to the ``Node`` or ``Node2D`` no longer forces a cast to 127``float64`` when the data is one of the other dtypes supported by the dwt 128(``float32``, ``complex64``, ``complex128``). 129 130Calling ``pywt.threshold`` with ``mode='soft'`` now works properly for 131complex-valued inputs. 132 133A segfault when running multiple `swt2` or `swtn` transforms concurrently has 134been fixed. 135 136Several instances of deprecated numpy multi-indexing that caused warnings in 137numpy >=1.15 have been resolved. 138 139The 2d inverse stationary wavelet transform, `iswt2`, now supports non-square 140inputs (an unnecessary check for square inputs was removed). 141 142Wavelet packets no longer convert float32 to float64 upon assignment to nodes. 143 144Doctests have been updated to also work with NumPy >= 1.14, 145 146Indexing conventions have been updated to avoid FutureWarnings in NumPy 1.15. 147 148 149Other changes 150============= 151 152Python 3.7 is now officially supported. 153 154 155Authors 156======= 157 158* 0-tree + 159* Jacopo Antonello + 160* Matthew Brett + 161* Saket Choudhary + 162* Michael V. DePalatis + 163* Daniel Goertzen + 164* Ralf Gommers 165* Mark Harfouche + 166* John Kirkham + 167* Dawid Laszuk + 168* Gregory R. Lee 169* Michel Pelletier + 170* Balint Reczey + 171* SylvainLan + 172* Daniele Tricoli 173* Kai Wohlfahrt 174 175A total of 16 people contributed to this release. 176People with a "+" by their names contributed a patch for the first time. 177This list of names is automatically generated, and may not be fully complete. 178 179 180Issues closed for v1.0.0 181------------------------ 182 183The following 15 issues were closed for this release. 184 185* `#405 <https://github.com/PyWavelets/pywt/issues/405>`__: New warning appearing 186* `#397 <https://github.com/PyWavelets/pywt/issues/397>`__: Make pip install work if numpy is not yet installed 187* `#396 <https://github.com/PyWavelets/pywt/issues/396>`__: Allow more levels in wavedec 188* `#386 <https://github.com/PyWavelets/pywt/issues/386>`__: Improve documentation for cwt 189* `#396 <https://github.com/PyWavelets/pywt/issues/396>`__: Allow more levels in wavedec 190* `#368 <https://github.com/PyWavelets/pywt/issues/368>`__: Bug in ISWT2 for non-rectangular arrays 191* `#363 <https://github.com/PyWavelets/pywt/issues/363>`__: Crash threading swt2 192* `#357 <https://github.com/PyWavelets/pywt/issues/357>`__: reconstruction from array_to_coeff and waverec 193* `#352 <https://github.com/PyWavelets/pywt/issues/352>`__: FYI: PyWavelet does not correctly declare setup.py dependency... 194* `#338 <https://github.com/PyWavelets/pywt/issues/338>`__: upcoef - TypeError: No matching signature found 195* `#335 <https://github.com/PyWavelets/pywt/issues/335>`__: Build issue: PyWavelets does not install from sdist 196* `#333 <https://github.com/PyWavelets/pywt/issues/333>`__: user-friendly error messages regarding discrete vs. continuous... 197* `#326 <https://github.com/PyWavelets/pywt/issues/326>`__: Allow complex dtype of input 198* `#316 <https://github.com/PyWavelets/pywt/issues/316>`__: Test fail in some architectures 199* `#312 <https://github.com/PyWavelets/pywt/issues/312>`__: Documentation should suggest using the default conda channel 200* `#308 <https://github.com/PyWavelets/pywt/issues/308>`__: incorporate bandwidths into CWT wavelet names for families `cmor`,... 201* `#306 <https://github.com/PyWavelets/pywt/issues/306>`__: dwt_max_levels not enough documentation 202* `#302 <https://github.com/PyWavelets/pywt/issues/302>`__: Can't remove cA and then reconstruct 203* `#290 <https://github.com/PyWavelets/pywt/issues/290>`__: idwtn should treat coefficients set to None as zeros 204* `#288 <https://github.com/PyWavelets/pywt/issues/288>`__: RuntimeErrors and segfaults from swt2() in threaded environments 205 206Pull requests for v1.0.0 207------------------------ 208 209A total of 53 pull requests were merged for this release. 210 211* `#248 <https://github.com/PyWavelets/pywt/pull/248>`__: DOC: sync PyWavelets main descriptions. 212* `#249 <https://github.com/PyWavelets/pywt/pull/249>`__: Add pyqtgraph demo for plotting wavelets 213* `#254 <https://github.com/PyWavelets/pywt/pull/254>`__: DOC: fix rendering of wavelist docstring 214* `#255 <https://github.com/PyWavelets/pywt/pull/255>`__: ENH: improve iswt performance 215* `#256 <https://github.com/PyWavelets/pywt/pull/256>`__: ENH: add iswtn (n-dimensional inverse SWT) 216* `#257 <https://github.com/PyWavelets/pywt/pull/257>`__: s/addional/additional/ 217* `#260 <https://github.com/PyWavelets/pywt/pull/260>`__: TST: test OS X build on TravisCI. Closes gh-75. 218* `#262 <https://github.com/PyWavelets/pywt/pull/262>`__: avoid some compiler warnings 219* `#263 <https://github.com/PyWavelets/pywt/pull/263>`__: MAINT: better exception message for Wavelet('continuous_familyname') 220* `#264 <https://github.com/PyWavelets/pywt/pull/264>`__: add ASV (continued) 221* `#265 <https://github.com/PyWavelets/pywt/pull/265>`__: MAINT: fix more compiler warnings 222* `#269 <https://github.com/PyWavelets/pywt/pull/269>`__: allow string input in dwt_max_level 223* `#270 <https://github.com/PyWavelets/pywt/pull/270>`__: DOC: update ISWT documentation 224* `#272 <https://github.com/PyWavelets/pywt/pull/272>`__: allow separate wavelet/mode for each axis in routines based on... 225* `#273 <https://github.com/PyWavelets/pywt/pull/273>`__: fix non-integer index error 226* `#275 <https://github.com/PyWavelets/pywt/pull/275>`__: ENH: use single precision routines for half-precision inputs 227* `#276 <https://github.com/PyWavelets/pywt/pull/276>`__: update wp_scalogram demo work with matplotlib 2.0 228* `#285 <https://github.com/PyWavelets/pywt/pull/285>`__: Fix spelling typo 229* `#286 <https://github.com/PyWavelets/pywt/pull/286>`__: MAINT: Package the license file 230* `#291 <https://github.com/PyWavelets/pywt/pull/291>`__: idwtn should allow coefficients to be set as None 231* `#292 <https://github.com/PyWavelets/pywt/pull/292>`__: MAINT: ensure tests are included in wheels 232* `#294 <https://github.com/PyWavelets/pywt/pull/294>`__: FIX: shape adjustment in waverec should not assume a transform... 233* `#299 <https://github.com/PyWavelets/pywt/pull/299>`__: DOC: update outdated scipy-user email address 234* `#300 <https://github.com/PyWavelets/pywt/pull/300>`__: ENH: compiling with C99 support (non-MSVC only) 235* `#303 <https://github.com/PyWavelets/pywt/pull/303>`__: DOC: better document how to handle omitted coefficients in multilevel... 236* `#309 <https://github.com/PyWavelets/pywt/pull/309>`__: Document how max levels are determined for multilevel DWT and... 237* `#310 <https://github.com/PyWavelets/pywt/pull/310>`__: parse CWT wavelet names for parameters 238* `#314 <https://github.com/PyWavelets/pywt/pull/314>`__: TST: Explicity align data records in test_byte_offset() 239* `#317 <https://github.com/PyWavelets/pywt/pull/317>`__: TST: specify rtol and atol for assert_allclose calls in test_swt_decomposition 240* `#320 <https://github.com/PyWavelets/pywt/pull/320>`__: Suggest using default conda channel to install 241* `#321 <https://github.com/PyWavelets/pywt/pull/321>`__: BLD: add pyproject.toml file (PEP 518 support). 242* `#322 <https://github.com/PyWavelets/pywt/pull/322>`__: support soft thresholding of complex valued data 243* `#331 <https://github.com/PyWavelets/pywt/pull/331>`__: Rename to CONTRIBUTING.rst 244* `#337 <https://github.com/PyWavelets/pywt/pull/337>`__: provide a more helpful error message for wrong wavelet type 245* `#339 <https://github.com/PyWavelets/pywt/pull/339>`__: check for wrong number of dimensions in upcoef and downcoef 246* `#340 <https://github.com/PyWavelets/pywt/pull/340>`__: DOC: fix broken link to Airspeed Velocity documentation 247* `#344 <https://github.com/PyWavelets/pywt/pull/344>`__: force legacy numpy repr for doctests 248* `#349 <https://github.com/PyWavelets/pywt/pull/349>`__: test case for CWT with complex input 249* `#350 <https://github.com/PyWavelets/pywt/pull/350>`__: better document the size requirements for swt/swt2/swtn 250* `#351 <https://github.com/PyWavelets/pywt/pull/351>`__: Add two new antisymmetric edge modes 251* `#353 <https://github.com/PyWavelets/pywt/pull/353>`__: DOC: add citation info to the front page of the docs. 252* `#354 <https://github.com/PyWavelets/pywt/pull/354>`__: add firm (semi-soft) and non-negative garotte thresholding 253* `#355 <https://github.com/PyWavelets/pywt/pull/355>`__: swt(): inference of level=None to depend on axis 254* `#356 <https://github.com/PyWavelets/pywt/pull/356>`__: fix: default level in `wavedec2` and `wavedecn` can be too conservative 255* `#360 <https://github.com/PyWavelets/pywt/pull/360>`__: fix Continuous spelling 256* `#361 <https://github.com/PyWavelets/pywt/pull/361>`__: AttributeError when using coeffs_to_array 257* `#362 <https://github.com/PyWavelets/pywt/pull/362>`__: Fix spelling of continuous globally 258* `#364 <https://github.com/PyWavelets/pywt/pull/364>`__: DOC: Explicitly print wavelet name for invalid wavelets 259* `#367 <https://github.com/PyWavelets/pywt/pull/367>`__: fix segfault related to parallel SWT 260* `#369 <https://github.com/PyWavelets/pywt/pull/369>`__: remove iswt2's restriction on non-square inputs 261* `#376 <https://github.com/PyWavelets/pywt/pull/376>`__: add common 1d synthetic signals 262* `#377 <https://github.com/PyWavelets/pywt/pull/377>`__: minor update to demo_signals 263* `#378 <https://github.com/PyWavelets/pywt/pull/378>`__: numpy: 1.15 multiindexing warning. targetted fix 264* `#380 <https://github.com/PyWavelets/pywt/pull/380>`__: BLD: fix doc build on ReadTheDocs, need matplotlib for plots... 265* `#381 <https://github.com/PyWavelets/pywt/pull/381>`__: Fix corner case for small scales in CWT 266* `#382 <https://github.com/PyWavelets/pywt/pull/382>`__: avoid FutureWarnings related to multiindexing in Numpy1.15 267* `#383 <https://github.com/PyWavelets/pywt/pull/383>`__: adding Community guidelines 268* `#384 <https://github.com/PyWavelets/pywt/pull/384>`__: swap swt2 coefficient order (and remove FutureWarnings) 269* `#387 <https://github.com/PyWavelets/pywt/pull/387>`__: improve CWT docs 270* `#390 <https://github.com/PyWavelets/pywt/pull/390>`__: MAINT: update Python version support. Closes gh-385. 271* `#391 <https://github.com/PyWavelets/pywt/pull/391>`__: fix broken link in documentation 272* `#392 <https://github.com/PyWavelets/pywt/pull/392>`__: do not force float64 dtype on assignment to Node, Node2D 273* `#398 <https://github.com/PyWavelets/pywt/pull/398>`__: MAINT: update .gitignore for files generated during build. 274* `#401 <https://github.com/PyWavelets/pywt/pull/401>`__: Fix failing numpy 1.9.3 build on Travis CI 275* `#403 <https://github.com/PyWavelets/pywt/pull/403>`__: Change ValueError to UserWarning when level is > dwt_max_level 276* `#404 <https://github.com/PyWavelets/pywt/pull/404>`__: BLD: fix ReadTheDocs build. Outdated NumPy gave a conflict with MPL. 277* `#410 <https://github.com/PyWavelets/pywt/pull/410>`__: DOC: rewrite docs front page 278* `#413 <https://github.com/PyWavelets/pywt/pull/413>`__: add wavelets.pybytes.com disclaimer 279