Skip to main content

PyPI Docs CI

manifolds-rs

Dimensionality reduction for single-cell and computational biology. The Rust crate does the work; this is a scikit-learn shaped layer over it.

Nine algorithms on the CPU, four of them with GPU variants where the neighbour search and the optimiser (UMAP's Adam, t-SNE's three-kernel FFT) move to the device. Scanpy-style mf.umap(adata) and mf.tsne(adata) for AnnData. No CUDA runtime to install: the GPU backend is wgpu, so it runs on Metal, Vulkan or DX12 and ships in the ordinary wheel.

Documentation: https://gregorlueg.github.io/manifolds-rs/

This package versions separately from the Rust crate. Changes here are in python/CHANGELOG.md; the crate's are in CHANGELOG.md.

Install

uv pip install manifolds-rs

Wheels are built for Linux x86_64 and macOS on both architectures, against Python 3.10 and up.

Thirty seconds

import manifolds_rs as mf

X, labels = mf.datasets.clustered(20_000, dim=50, n_clusters=12)

embedding = mf.UMAP(n_neighbors=15, min_dist=0.1).fit_transform(X)

Every estimator takes its parameters in the constructor, its data in fit, and hands back an (n_samples, n_components) array. get_params and set_params are there, so clone and Pipeline work without scikit-learn being an install requirement.

What's here

Class What it is for
UMAP The default choice. Local structure, decent global structure from the spectral init.
DensMAP UMAP with relative density preserved, so a dense region stays dense.
TSNE Local structure above all else. Barnes-Hut, the faster quick-and-dirty approx="qd", or FFT-interpolated approx="fft" / "fft_3k" for large N. 2-D only.
DensNE t-SNE with the same density correction.
DREAMS t-SNE pulled towards a global reference (PCA, or any layout you pass), so the clusters keep a sensible arrangement.
PHATE Continuous structure. Trajectories and branch points survive this.
PaCMAP Global structure without leaning on a spectral init. Three pair types.
DiffusionMaps The spectral embedding PHATE is built on.
ForceAtlas2 Gephi's force-directed layout on the kNN graph, as in scanpy's draw_graph. 2-D only.
UMAPGpu, DensMAPGpu, TSNEGpu, DREAMSGpu The same, with the neighbour search on the device. TSNEGpu(approx="fft_3k_gpu") runs the optimiser there too.

AnnData

With uv pip install 'manifolds-rs[anndata]', mf.umap and mf.tsne drop in for sc.tl.umap and sc.tl.tsne: same slots, so sc.pl.umap just works.

import scanpy as sc
import manifolds_rs as mf

sc.pp.pca(adata)
sc.pp.neighbors(adata)
mf.umap(adata)  # obsm["X_umap"], uns["umap"]
mf.tsne(adata)  # obsm["X_tsne"], uns["tsne"]
sc.pl.umap(adata, color="leiden")

device="gpu" switches to the GPU estimators. On 25,000 cells on an M1 Max, mf.umap ran in 1.5s against 10.6s for sc.tl.umap, and mf.tsne in 9.7s (4.9s with device="gpu", approx="fft_3k_gpu") against 47.2s for a 10-thread sc.tl.tsne. The AnnData page has the full table, cluster separation included, and the caveats.

Parameters

The knobs people actually turn are ordinary constructor arguments. The rest live in frozen dataclasses, one per group, and anything you leave alone keeps the crate's default:

mf.UMAP(
    n_neighbors=30,
    ann="hnsw",
    nn_params=mf.NeighbourParams(m=32, ef_search=200),
    optim_params=mf.UmapOptim(gamma=1.5, neg_sample_rate=10),
)

Every parameter has exactly one home. If it is a constructor argument it is not in the group, so there is never a question of which wins.

Reusing the neighbour graph

Running several embeddings over the same data? Build the graph once. On anything large the search is most of the runtime.

ind, dist = mf.knn_graph(X, k=15, ann="hnsw")

a = mf.UMAP().fit_transform(X, knn_indices=ind, knn_distances=dist)
b = mf.PaCMAP().fit_transform(X, knn_indices=ind, knn_distances=dist)

No transform

None of these projects new points, so there is no transform. That is the crate's position rather than a gap in the bindings: embedding new data means refitting on the combined set, which moves the existing coordinates too. Anyone telling you otherwise is doing something to the new points that is not the same operation the old ones went through.

Precision

float32 in, float32 throughout; float64 in, float64 throughout. Anything else is promoted to float64 rather than narrowed, so precision is never lost by accident. The GPU estimators are the exception and cast to float32, because WGSL has no float64 and the alternative is a failure inside a kernel.

What is not in the wheel

The MLX backends for Apple Silicon. They link mlx-c dynamically, so they need a source build: brew install mlx-c, then maturin develop --release --features mlx. See the GPU page of the docs.

Parametric UMAP is in the crate but not yet bound.

Metadata

Release files for manifolds-rs 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for manifolds-rs 0.4.1
File Interpreter ABI Platform
manifolds_rs-0.4.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
manifolds_rs-0.4.1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
manifolds_rs-0.4.1-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 46.9 MB

Release files / manifolds_rs-0.4.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL manifolds_rs-0.4.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 16.8 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
d3cbcf2e7a4e3325e885959fe74bfb795d0eefacd2350e98a320003c9e1ce86c
BLAKE2b-256 checksum
How to use checksums
2c61bd91ff741a56035d455941a03a1fc17d6464a22020ed701fa8f5a2301e9e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 18, 2026.

Transparency log

Release files / manifolds_rs-0.4.1-cp310-abi3-macosx_11_0_arm64.whl

Download URL manifolds_rs-0.4.1-cp310-abi3-macosx_11_0_arm64.whl
Size 14.4 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8a9977326215144586e0c807e3181eb268c26c7b4a03c178e1a3227c931dd2cf
BLAKE2b-256 checksum
How to use checksums
dda54b1ac264e7765a614839f0c7d69158b3867c0bbeef8b4bafa8317a1ef6c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 18, 2026.

Transparency log

Release files / manifolds_rs-0.4.1-cp310-abi3-macosx_10_12_x86_64.whl

Download URL manifolds_rs-0.4.1-cp310-abi3-macosx_10_12_x86_64.whl
Size 15.7 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
9c8de4785b54352b86babdaa74438ded54db4f8eea6eff1ae135e3a73732d099
BLAKE2b-256 checksum
How to use checksums
695bd58938dbcbc99fcb67c930da6897da52624cf5b32273df91a11d9cc8b153
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 18, 2026.

Transparency log

Security for manifolds-rs 0.4.1

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.

Full provenance

All 3 files in this release have been uploaded with provenance metadata.

Select from 3 files

Attestation for manifolds_rs-0.4.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

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 Oct 18, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page