From 9d726cff056856b2010c6185ec1961ffed544112 Mon Sep 17 00:00:00 2001 From: Nicholas Justice Date: Sat, 4 Apr 2026 23:26:06 -0400 Subject: [PATCH 1/2] fix: copy connectivities before passing to umap-learn --- docs/release-notes/4028.fix.md | 1 + src/scanpy/tools/_umap.py | 2 +- tests/test_embedding.py | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 docs/release-notes/4028.fix.md diff --git a/docs/release-notes/4028.fix.md b/docs/release-notes/4028.fix.md new file mode 100644 index 0000000000..7bf2a2692a --- /dev/null +++ b/docs/release-notes/4028.fix.md @@ -0,0 +1 @@ +{func}`scanpy.tl.umap` no longer silently mutates `adata.obsp['connectivities']` via a shared sparse buffer {smaller}`N Justice` diff --git a/src/scanpy/tools/_umap.py b/src/scanpy/tools/_umap.py index c3d59e5537..2d9b65d931 100644 --- a/src/scanpy/tools/_umap.py +++ b/src/scanpy/tools/_umap.py @@ -205,7 +205,7 @@ def umap( # noqa: PLR0913 n_epochs = default_epochs if maxiter is None else maxiter x_umap, _ = simplicial_set_embedding( data=x, - graph=neighbors["connectivities"].tocoo(), + graph=neighbors["connectivities"].tocoo(copy=True), n_components=n_components, initial_alpha=alpha, a=a, diff --git a/tests/test_embedding.py b/tests/test_embedding.py index 10c09f932a..c92e1205ab 100644 --- a/tests/test_embedding.py +++ b/tests/test_embedding.py @@ -80,6 +80,21 @@ def test_umap_init_paga(layout): sc.tl.umap(pbmc, init_pos="paga") +def test_umap_preserves_connectivities(): + # https://github.com/scverse/scanpy/issues/4028 + pbmc = pbmc68k_reduced()[:100, :].copy() + conn = pbmc.obsp["connectivities"] + data_before = conn.data.copy() + nnz_before = conn.nnz + + sc.tl.umap(pbmc) + + assert_array_equal(data_before, conn.data) + assert conn.nnz == nnz_before + assert (conn.data == 0).sum() == 0, "CSR should have no explicit zeros" + assert "X_umap" in pbmc.obsm + + @pytest.mark.parametrize("rng_arg", ["rng", "random_state"]) def test_diffmap( subtests: pytest.Subtests, rng_arg: Literal["rng", "random_state"] From b446f4154f3fbda396946af8a27e7224e5277c7c Mon Sep 17 00:00:00 2001 From: "Philipp A." Date: Tue, 7 Apr 2026 13:36:44 +0200 Subject: [PATCH 2/2] Use PR number in relnote file --- docs/release-notes/{4028.fix.md => 4031.fix.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/release-notes/{4028.fix.md => 4031.fix.md} (100%) diff --git a/docs/release-notes/4028.fix.md b/docs/release-notes/4031.fix.md similarity index 100% rename from docs/release-notes/4028.fix.md rename to docs/release-notes/4031.fix.md