Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .coveragerc
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ omit =
*/pywt/_doc_utils.py*
*/pywt/_pytesttester.py*
*/pywt/_pytest.py*
*/pywt/data/create_dat.py
*.pxd
stringsource
plugins = Cython.Coverage
15 changes: 2 additions & 13 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,6 @@ env:
CYTHONSPEC: cython
NUMPY_MIN: numpy==1.23.0
CYTHON_MIN: cython==3.0.4
SCIPY_MIN: scipy==1.9.0

jobs:
test_pywavelets_linux:
Expand All@@ -36,7 +35,6 @@ jobs:
runs-on: [ubuntu-latest] # Arm runner tested separately, see below
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
Expand All@@ -52,8 +50,6 @@ jobs:
OPTIONS_NAME: "minimum-req"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SCIPY: 1
OPTIONS_NAME: "with-scipy"
- runs-on: ubuntu-latest
python-version: "3.10"
USE_SDIST: 1
Expand DownExpand Up@@ -81,7 +77,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
OPTIONS_NAME: ${{ matrix.OPTIONS_NAME }}
run: |
Expand All@@ -97,11 +92,9 @@ jobs:
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN}
pip install ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython
pip install ${PIP_FLAGS} numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand DownExpand Up@@ -147,7 +140,7 @@ jobs:
popd

test_pywavelets_linux_free_threaded:
name: linux-cp313t-with-scipy
name: linux-cp313t-default
runs-on: ubuntu-latest
strategy:
# Ensure that a wheel builder finishes even if another fails
Expand All@@ -169,7 +162,7 @@ jobs:
python --version
pip install --upgrade pip build
# We need nightly wheels for free-threaded support and latest fixes
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy scipy
pip install --pre -i https://pypi.anaconda.org/scientific-python-nightly-wheels/simple cython numpy
pip install pytest meson-python ninja
pip install . -v --no-build-isolation

Expand All@@ -190,7 +183,6 @@ jobs:
matrix:
python-version: ["3.10", "3.13"]
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
PIP_FLAGS: [""]
Expand DownExpand Up@@ -219,7 +211,6 @@ jobs:
MINIMUM_REQUIREMENTS: ${{ matrix.MINIMUM_REQUIREMENTS }}
PIP_FLAGS: ${{ matrix.PIP_FLAGS }}
USE_SDIST: ${{ matrix.USE_SDIST }}
USE_SCIPY: ${{ matrix.USE_SCIPY }}
REFGUIDE_CHECK: ${{ matrix.REFGUIDE_CHECK }}
CC: /usr/bin/clang
CXX: /usr/bin/clang++
Expand All@@ -233,10 +224,8 @@ jobs:
# Set numpy version first, other packages link against it
if [ "${MINIMUM_REQUIREMENTS}" == "1" ]; then
pip install ${CYTHON_MIN} ${NUMPY_MIN}
if [ "${USE_SCIPY}" == "1" ]; then pip install ${SCIPY_MIN}; fi
else
pip install ${PIP_FLAGS} cython numpy
if [ "${USE_SCIPY}" == "1" ]; then pip install ${PIP_FLAGS} scipy; fi
fi
pip install ${PIP_FLAGS} matplotlib pytest

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/wheel_tests_and_release.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,7 +49,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand DownExpand Up@@ -136,7 +136,7 @@ jobs:
if: ${{ matrix.cibw_python }} == "cp313t"
run: |
PYPI_URL="https://pypi.anaconda.org/scientific-python-nightly-wheels/simple"
CIBW_DEPS="pip install --pre -i $PYPI_URL cython scipy &&\
CIBW_DEPS="pip install --pre -i $PYPI_URL cython &&\
pip install numpy pytest meson-python ninja"
NO_BUILD_ISOLATION="pip; args: --no-build-isolation"
echo "CIBW_BEFORE_BUILD=$CIBW_DEPS" >> "$GITHUB_ENV"
Expand Down
4 changes: 1 addition & 3 deletions README.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,9 +67,7 @@ Installation

PyWavelets supports `Python`_ >=3.10, and is only dependent on `NumPy`_
(supported versions are currently ``>= 1.23.0``). To pass all of the tests,
`Matplotlib`_ is also required. `SciPy`_ is also an optional dependency. When
present, FFT-based continuous wavelet transforms will use FFTs from SciPy
rather than NumPy.
`Matplotlib`_ is also required.

There are binary wheels for Intel Linux, Windows and macOS / OSX on PyPi. If
you are on one of these platforms, you should get a binary (precompiled)
Expand Down
2 changes: 1 addition & 1 deletion doc/source/dev/conduct/code_of_conduct.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -165,7 +165,7 @@ Endnotes
We are thankful to the SciPy developers for creating the code of conduct we
have adapted here.

- `Scipy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_
- `SciPy Code of Conduct <http://scipy.github.io/devdocs/dev/conduct/code_of_conduct.html>`_

The SciPy code of conduct was in turn inspired by the following documents:

Expand Down
3 changes: 1 addition & 2 deletions doc/source/install.rst
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,7 @@ For the requirements needed to build from source are (Python, NumPy and Cython
minimum versions in particular), see ``pyproject.toml``.

To run all the tests for PyWavelets, you will also need to install the
Matplotlib_ package. If SciPy_ is available, FFT-based continuous wavelet
transforms will use the FFT implementation from SciPy instead of NumPy.
Matplotlib_ package.

.. seealso:: The :ref:`Development guide <dev-index>` section contains more
information on building and installing from source code.
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,9 +50,6 @@ classifiers = [
"Topic :: Software Development :: Libraries :: Python Modules"
]

[project.optional-dependencies]
optional = ["scipy>=1.9"]

[project.urls]
homepage = "https://github.com/PyWavelets/pywt"
source = "https://github.com/PyWavelets/pywt"
Expand Down
32 changes: 11 additions & 21 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,24 +14,14 @@

import numpy as np

try:
import scipy
fftmodule = scipy.fft
next_fast_len = fftmodule.next_fast_len
except ImportError:
fftmodule = np.fft

# provide a fallback so scipy is an optional requirement
# note: numpy.fft in numpy 2.0 is as fast as scipy.fft, so could be used
# unconditionally once the minimum supported numpy version is >=2.0
def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
This fallback is less efficient than `scipy.fftpack.next_fast_len`
"""
return 2**ceil(np.log2(n))

def next_fast_len(n):
"""Round up size to the nearest power of two.

Given a number of samples `n`, returns the next power of two
following this number to take advantage of FFT speedup.
"""
return 2**ceil(np.log2(n))


def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
Expand DownExpand Up@@ -177,10 +167,10 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
)
if size_scale != size_scale0:
# Must recompute fft_data when the padding size changes.
fft_data = fftmodule.fft(data, size_scale, axis=-1)
fft_data = np.fft.fft(data, size_scale, axis=-1)
size_scale0 = size_scale
fft_wav = fftmodule.fft(int_psi_scale, size_scale, axis=-1)
conv = fftmodule.ifft(fft_wav * fft_data, axis=-1)
fft_wav = np.fft.fft(int_psi_scale, size_scale, axis=-1)
conv = np.fft.ifft(fft_wav * fft_data, axis=-1)
conv = conv[..., :data.shape[-1] + int_psi_scale.size - 1]

coef = - np.sqrt(scale) * np.diff(conv, axis=-1)
Expand Down
4 changes: 2 additions & 2 deletions pywt/data/create_dat.py → util/create_dat.py
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python

"""Helper script for creating image .dat files by numpy.save
"""Helper script for creating image .dat files by numpy.save.

Usage:

Expand All@@ -10,7 +10,7 @@

python create_dat.py aero.png aero.dat

Requires Scipy and PIL.
Requires SciPy and PIL, which need to be installed separately.
"""


Expand Down