diff --git a/docs/release-notes/1685.dev.md b/docs/release-notes/1685.dev.md new file mode 100644 index 000000000..f16dce06b --- /dev/null +++ b/docs/release-notes/1685.dev.md @@ -0,0 +1 @@ +Remove `shall_` from variable names in `settings` {user}`ilan-gold` diff --git a/src/anndata/_core/anndata.py b/src/anndata/_core/anndata.py index c603c0eca..45382c588 100644 --- a/src/anndata/_core/anndata.py +++ b/src/anndata/_core/anndata.py @@ -696,7 +696,7 @@ def raw(self) -> Raw: The :attr:`raw` attribute is initialized with the current content of an object by setting:: - adata.raw = adata + adata.raw = adata.copy() Its content can be deleted:: diff --git a/tests/test_base.py b/tests/test_base.py index 60ad70caf..e1401ed74 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -277,7 +277,7 @@ def test_setting_dim_index(dim): mapping_attr = f"{dim}m" orig = gen_adata((5, 5)) - orig.raw = orig + orig.raw = orig.copy() curr = orig.copy() view = orig[:, :] new_idx = pd.Index(list("abcde"), name="letters") @@ -590,7 +590,7 @@ def test_convenience(): adata = adata_sparse.copy() adata.layers["x2"] = adata.X * 2 adata.var["anno2"] = ["p1", "p2", "p3"] - adata.raw = adata + adata.raw = adata.copy() adata.X = adata.X / 2 adata_dense = adata.copy() adata_dense.X = adata_dense.X.toarray() diff --git a/tests/test_concatenate.py b/tests/test_concatenate.py index 075b5cfe6..1c8bd4873 100644 --- a/tests/test_concatenate.py +++ b/tests/test_concatenate.py @@ -697,9 +697,9 @@ def test_concatenate_with_raw(): layers=dict(Xs=X4), ) - adata1.raw = adata1 - adata2.raw = adata2 - adata3.raw = adata3 + adata1.raw = adata1.copy() + adata2.raw = adata2.copy() + adata3.raw = adata3.copy() adata_all = AnnData.concatenate(adata1, adata2, adata3) assert isinstance(adata_all.raw, Raw) @@ -713,7 +713,7 @@ def test_concatenate_with_raw(): assert_equal(adata_all.raw.to_adata().obs, adata_all.obs) assert np.array_equal(np.nan_to_num(adata_all.raw.X), np.nan_to_num(adata_all.X)) - adata3.raw = adata4 + adata3.raw = adata4.copy() adata_all = AnnData.concatenate(adata1, adata2, adata3, join="outer") assert isinstance(adata_all.raw, Raw) assert set(adata_all.raw.var_names) == set("abcdz") diff --git a/tests/test_deprecations.py b/tests/test_deprecations.py index 5f6a05b12..b5cc44c29 100644 --- a/tests/test_deprecations.py +++ b/tests/test_deprecations.py @@ -25,7 +25,7 @@ def adata(): obs=dict(obs_names=["s1", "s2"], anno1=["c1", "c2"]), var=dict(var_names=["a", "b", "c"]), ) - adata.raw = adata + adata.raw = adata.copy() adata.layers["x2"] = adata.X * 2 adata.var["anno2"] = ["p1", "p2", "p3"] adata.X = adata.X / 2 diff --git a/tests/test_get_vector.py b/tests/test_get_vector.py index baf0fd7d6..87af324b0 100644 --- a/tests/test_get_vector.py +++ b/tests/test_get_vector.py @@ -36,7 +36,7 @@ def test_amgibuous_keys(): ), ) - adata.raw = adata + adata.raw = adata.copy() for k in var_keys: # These are mostly to check that the test is working diff --git a/tests/test_gpu.py b/tests/test_gpu.py index c6f49a696..8f3c4c250 100644 --- a/tests/test_gpu.py +++ b/tests/test_gpu.py @@ -24,7 +24,7 @@ def test_adata_raw_gpu(): adata = AnnData( X=cupy_sparse.random(500, 50, density=0.01, format="csr", dtype=cp.float32) ) - adata.raw = adata + adata.raw = adata.copy() assert isinstance(adata.raw.X, sparse.csr_matrix) diff --git a/tests/test_io_conversion.py b/tests/test_io_conversion.py index 33f50b6d9..217a9cc16 100644 --- a/tests/test_io_conversion.py +++ b/tests/test_io_conversion.py @@ -39,7 +39,7 @@ def test_sparse_to_dense_disk(tmp_path, mtx_format, to_convert): dense_from_mem_pth = tmp_path / "dense_mem.h5ad" dense_from_disk_pth = tmp_path / "dense_disk.h5ad" mem = gen_adata((50, 50), mtx_format) - mem.raw = mem + mem.raw = mem.copy() mem.write_h5ad(mem_pth) disk = ad.read_h5ad(mem_pth, backed="r") @@ -66,7 +66,7 @@ def test_sparse_to_dense_disk(tmp_path, mtx_format, to_convert): def test_sparse_to_dense_inplace(tmp_path, spmtx_format): pth = tmp_path / "adata.h5ad" orig = gen_adata((50, 50), spmtx_format) - orig.raw = orig + orig.raw = orig.copy() orig.write(pth) backed = ad.read_h5ad(pth, backed="r+") backed.write(as_dense=("X", "raw/X")) @@ -97,7 +97,7 @@ def test_sparse_to_dense_errors(tmp_path): def test_dense_to_sparse_memory(tmp_path, spmtx_format, to_convert): dense_path = tmp_path / "dense.h5ad" orig = gen_adata((50, 50), np.array) - orig.raw = orig + orig.raw = orig.copy() orig.write_h5ad(dense_path) assert not isinstance(orig.X, sparse.spmatrix) assert not isinstance(orig.raw.X, sparse.spmatrix) diff --git a/tests/test_io_elementwise.py b/tests/test_io_elementwise.py index d1a748411..e46cd7d81 100644 --- a/tests/test_io_elementwise.py +++ b/tests/test_io_elementwise.py @@ -374,7 +374,7 @@ def test_write_indptr_dtype_override(store, sparse_format): def test_io_spec_raw(store): adata = gen_adata((3, 2)) - adata.raw = adata + adata.raw = adata.copy() write_elem(store, "adata", adata) diff --git a/tests/test_raw.py b/tests/test_raw.py index a21f21f8a..d0ee86833 100644 --- a/tests/test_raw.py +++ b/tests/test_raw.py @@ -38,7 +38,7 @@ def adata_raw() -> ad.AnnData: adata = ad.AnnData( np.array(data, dtype="int32"), obs=obs_dict, var=var_dict, uns=uns_dict ) - adata.raw = adata + adata.raw = adata.copy() # Make them different shapes adata = adata[:, [0, 1]].copy() return adata @@ -131,7 +131,7 @@ def test_raw_as_parent_view(): # https://github.com/scverse/anndata/issues/288 a = ad.AnnData(np.ones((4, 3))) a.varm["PCs"] = np.ones((3, 3)) - a.raw = a + a.raw = a.copy() # create a Raw containing views. This used to trigger #288. b = a.raw[:, "0"] # actualize @@ -165,3 +165,10 @@ def test_to_adata_populates_obs(): from_raw = adata_w_raw.raw.to_adata() assert_equal(adata, from_raw) + + +def test_no_copy(): + adata = gen_adata((20, 10), X_type=np.asarray) + adata.raw = adata # no .copy() herer + np.log1p(adata.X, out=adata.X) + assert adata.X is adata.raw.X diff --git a/tests/test_readwrite.py b/tests/test_readwrite.py index ff5f40d0c..c8ed19d3f 100644 --- a/tests/test_readwrite.py +++ b/tests/test_readwrite.py @@ -133,7 +133,7 @@ def test_readwrite_kitchensink(tmp_path, storage, typ, backing_h5ad, dataset_kwa X = typ(X_list) adata_src = ad.AnnData(X, obs=obs_dict, var=var_dict, uns=uns_dict) assert not isinstance(adata_src.obs["oanno1"].dtype, pd.CategoricalDtype) - adata_src.raw = adata_src + adata_src.raw = adata_src.copy() if storage == "h5ad": adata_src.write(backing_h5ad, **dataset_kwargs) @@ -242,7 +242,7 @@ def test_readwrite_equivalent_h5ad_zarr(tmp_path, typ): M, N = 100, 101 adata = gen_adata((M, N), X_type=typ) - adata.raw = adata + adata.raw = adata.copy() adata.write_h5ad(h5ad_pth) adata.write_zarr(zarr_pth) diff --git a/tests/test_transpose.py b/tests/test_transpose.py index 720733496..e672cf13d 100644 --- a/tests/test_transpose.py +++ b/tests/test_transpose.py @@ -24,7 +24,7 @@ def test_transpose_orig(): def _add_raw(adata, *, var_subset=slice(None)): new = adata[:, var_subset].copy() - new.raw = adata + new.raw = adata.copy() return new diff --git a/tests/test_views.py b/tests/test_views.py index 2d4a0a78d..4e4f4ab75 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -525,7 +525,7 @@ def test_layers_view(): # TODO: This can be flaky. Make that stop def test_view_of_view(matrix_type, subset_func, subset_func2): adata = gen_adata((30, 15), X_type=matrix_type) - adata.raw = adata + adata.raw = adata.copy() if subset_func is single_subset: pytest.xfail("Other subset generating functions have trouble with this") var_s1 = subset_func(adata.var_names, min_size=4)