Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

kooplearn logo

DocsCIcodecovPyPI versionPython versionsLicense

kooplearn is a Python library to learn evolution operators — also known as Koopman or Transfer operators — from data. kooplearn models can:

  1. Predict the evolution of states and observables.
  2. Estimate the eigenvalues and eigenfunctions of the learned evolution operators.
  3. Compute the Dynamic Mode Decomposition of states and observables.
  4. Learn neural-network representations $x_t \mapsto \varphi(x_t)$ for evolution operators.

Why Choosing kooplearn?

  1. It is easy to use and strictly adheres to the scikit-learn API.

  2. Kernel estimators are state-of-the-art:

  3. Includes representation-learning losses (implemented both in Pytorch and JAX) to train neural-network Koopman embeddings.

  4. Offers a collection of datasets for benchmarking evolution-operator learning algorithms.

Installation

To install the core version of kooplearn:

pip

pip install kooplearn

uv

uv add kooplearn

To enable neural-network representations using kooplearn.torch or kooplearn.jax:

pip

# Torch
pip install "kooplearn[torch]"# JAX
pip install "kooplearn[jax]"

uv

# Torch
uv add "kooplearn[torch]"# JAX
uv add "kooplearn[jax]"

From source

For development, clone the repository and install the package with all optional extras and dependency groups:

git clone https://github.com/Machine-Learning-Dynamical-Systems/kooplearn.git
cd kooplearn
uv sync --all-extras --all-groups

With pip>=25.1, the equivalent editable install is:

python -m pip install -U pip
python -m pip install -e ".[torch,jax]" --group dev --group docs --group examples

Testing

Run the default test suite from the repository root with:

uv run pytest

After installing with pip, use:

python -m pytest

Contributing

We welcome contributions from the community. See CONTRIBUTING.md for development setup, testing, issue reports, and pull request guidance.

License

This project is licensed under the MIT License.

Main contributors

kooplearn is an joint effort between teams at the Italian Institute of Technology in Genoa and the École polytechnique in Paris. The main contributors to the project are (in alphabetical order):

  • Vladimir Kostic
  • Karim Lounici
  • Giacomo Meanti
  • Erfan Mirzaei
  • Pietro Novelli
  • Daniel Ordoñez-Apraez
  • Grégoire Pacreau
  • Massimiliano Pontil
  • Giacomo Turri

The mantainer of this repo is Pietro Novelli.

Citing kooplearn

@article{kooplearn,
title={kooplearn: A scikit-learn compatible library of algorithms for evolution operator learning},
author={Turri, Giacomo and Pacreau, Grégoire and Meanti, Giacomo and Devergne, Timothée and Ordoñez-Apraez, Daniel and Mirzaei, Erfan and Belucci, Bruno and Lounici, Karim and Kostic, Vladimir R. and Pontil, Massimiliano and Novelli, Pietro},
doi={10.21105/joss.10342},
url={https://doi.org/10.21105/joss.10342},
year={2026},
publisher={The Open Journal},
volume={11},
number={122},
pages={10342},
journal={Journal of Open Source Software},
}

We hope you find kooplearn useful for your dynamical systems analysis. If you encounter any issues or have suggestions for improvements, please don't hesitate to raise an issue. Happy coding!

About

A Python package to learn the Koopman operator.

Topics

Resources

Code of conduct

Contributing

Stars

84 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages