pySPFM
A Python package for sparse hemodynamic deconvolution of fMRI data with scikit-learn compatible estimators.
pySPFM provides estimators for Paradigm Free Mapping (PFM) and related sparse deconvolution methods for fMRI analysis. The package follows scikit-learn conventions, making it easy to integrate with existing machine learning pipelines.
Features
- scikit-learn compatible API: Use familiar
fit(),transform(),fit_transform()methods - Multiple deconvolution methods:
SparseDeconvolution: Sparse Paradigm Free Mapping (SPFM) using LARS or FISTALowRankPlusSparse: SPLORA algorithm separating global and neuronal signalsStabilitySelection: Robust feature selection via bootstrap resampling
- Multi-echo fMRI support: Native support for multi-echo acquisitions
- Flexible regularization: Multiple lambda selection criteria (BIC, AIC, MAD, etc.)
- Command-line interface: Easy-to-use CLI for batch processing
Installation
pip install pySPFM
For development:
git clone https://github.com/Paradigm-Free-Mapping/pySPFM.git
cd pySPFM
pip install -e ".[dev,tests]"
Quick Start
Python API
from pySPFM import SparseDeconvolution
import numpy as np
# Load your fMRI data (n_timepoints, n_voxels)
X = np.random.randn(200, 1000) # Example data
# Create and fit the model
model = SparseDeconvolution(tr=2.0, criterion='bic')
model.fit(X)
# Get the deconvolved activity-inducing signals
activity = model.coef_
# Get the fitted (reconstructed) signal
fitted = model.get_fitted_signal()
# Compute explained variance
score = model.score(X)
print(f"Explained variance: {score:.2%}")
Low-Rank + Sparse Decomposition (SPLORA)
from pySPFM import LowRankPlusSparse
model = LowRankPlusSparse(tr=2.0, eigval_threshold=0.1)
model.fit(X)
# Separate components
sparse_activity = model.coef_ # Neuronal activity
global_signal = model.low_rank_ # Global/structured component
Command-Line Interface
# Sparse deconvolution
pySPFM sparse -i data.nii.gz -m mask.nii.gz -o output --tr 2.0
# Low-rank + sparse decomposition
pySPFM lowrank -i data.nii.gz -m mask.nii.gz -o output --tr 2.0
# Stability selection
pySPFM stability -i data.nii.gz -m mask.nii.gz -o output --tr 2.0 --n-surrogates 50
Estimators
| Estimator | Description | Use Case |
|---|---|---|
SparseDeconvolution |
Sparse PFM using LARS/FISTA | General deconvolution |
LowRankPlusSparse |
SPLORA algorithm | Separating global signals |
StabilitySelection |
Bootstrap-based selection | Robust feature detection |
API Reference
All estimators follow scikit-learn conventions:
fit(X): Fit the model to datatransform(X): Return deconvolved signalsfit_transform(X): Fit and transform in one stepscore(X): Return explained variance ratioget_params()/set_params(): Parameter accessclone(): Create unfitted copy
Development
This project uses uv for dependency management and tox for testing.
Running tests
# Current Python version
pytest pySPFM/tests/
# All supported versions (3.10, 3.11, 3.12)
tox
# Specific version
tox -e py310
References
- Caballero-Gaudes, C., Moia, S., Panwar, P., Bandettini, P. A., & Gonzalez-Castillo, J. (2019). A deconvolution algorithm for multi-echo functional MRI: Multi-echo Sparse Paradigm Free Mapping. NeuroImage, 202, 116081–116081. https://doi.org/10.1016/j.neuroimage.2019.116081
- Caballero Gaudes, C., Petridou, N., Francis, S. T., Dryden, I. L., & Gowland, P. A. (2013). Paradigm free mapping with sparse regression automatically detects single-trial functional magnetic resonance imaging blood oxygenation level dependent responses. Human Brain Mapping. https://doi.org/10.1002/hbm.21452
- Karahanoǧlu, F. I., Caballero-Gaudes, C., Lazeyras, F., & Van De Ville, D. (2013). Total activation: FMRI deconvolution through spatio-temporal regularization. NeuroImage. https://doi.org/10.1016/j.neuroimage.2013.01.067
- Uruñuela, E., Bolton, T. A., Van De Ville, D., & Caballero-Gaudes, C. (2023). Hemodynamic Deconvolution Demystified: Sparsity-Driven Regularization at Work. Aperture Neuro, 3, 1-25. https://doi.org/10.52294/001c.87574
Metadata
Release files for pySPFM 2.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyspfm-2.0.3.tar.gz | 6.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyspfm-2.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 6.3 MB
Release files / pyspfm-2.0.3.tar.gz
| Download URL | pyspfm-2.0.3.tar.gz |
|---|---|
| Size | 6.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2249939b26b19bffb46f2b15b2feb114859075bbdf41a9a5c6ee6901292f3dc8
|
|
BLAKE2b-256 checksum How to use checksums |
4ee223bf8c44a8cac768ca61f990ff0917134fb80667ad29ce01dafc9db763fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 19, 2026.
Transparency logRelease files / pyspfm-2.0.3-py3-none-any.whl
| Download URL | pyspfm-2.0.3-py3-none-any.whl |
|---|---|
| Size | 107.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
814437bf634959fb942a854b54c045755bd17c00b4d8257187dcfeb72b482b97
|
|
BLAKE2b-256 checksum How to use checksums |
a2df47eb1a362eebe7f0d585cdac00d75f42452134f0b30856a6261cb2ee80a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 19, 2026.
Transparency log