def test_pairwise_concat(axis, array_type): dim_sizes = [[100, 200, 50], [50, 50, 50]] if axis: dim_sizes.reverse() Ms, Ns = dim_sizes dim = ("obs", "var")[axis] alt = ("var", "obs")[axis] dim_attr = f"{dim}p" alt_attr = f"{alt}p" def gen_dim_array(m): return array_type(sparse.random(m, m, format="csr", density=0.1)) adatas = { k: AnnData( **{ "X": sparse.csr_matrix((m, n)), "obsp": { "arr": gen_dim_array(m) }, "varp": { "arr": gen_dim_array(n) }, }) for k, m, n in zip("abc", Ms, Ns) } w_pairwise = concat(adatas, axis=axis, label="orig", pairwise=True) wo_pairwise = concat(adatas, axis=axis, label="orig", pairwise=False) # Check that argument controls whether elements are included assert getattr(wo_pairwise, dim_attr) == {} assert getattr(w_pairwise, dim_attr) != {} # Check values of included elements full_inds = np.arange(w_pairwise.shape[axis]) groups = getattr(w_pairwise, dim).groupby("orig").indices for k, inds in groups.items(): orig_arr = getattr(adatas[k], dim_attr)["arr"] full_arr = getattr(w_pairwise, dim_attr)["arr"] # Check original values are intact assert_equal(orig_arr, _subset(full_arr, (inds, inds))) # Check that entries are filled with zeroes assert_equal( sparse.csr_matrix((len(inds), len(full_inds) - len(inds))), _subset(full_arr, (inds, np.setdiff1d(full_inds, inds))), ) assert_equal( sparse.csr_matrix((len(full_inds) - len(inds), len(inds))), _subset(full_arr, (np.setdiff1d(full_inds, inds), inds)), ) # Check that argument does not affect alternative axis assert "arr" in getattr( concat(adatas, axis=axis, pairwise=False, merge="first"), alt_attr)
def test_concatenate_obsm_outer(obsm_adatas, fill_val): outer = obsm_adatas[0].concatenate( obsm_adatas[1:], join="outer", fill_value=fill_val ) inner = obsm_adatas[0].concatenate(obsm_adatas[1:], join="inner") for k, inner_v in inner.obsm.items(): assert np.array_equal( _subset(outer.obsm[k], (slice(None), slice(None, inner_v.shape[1]))), inner_v, ) assert set(outer.obsm.keys()) == {"dense", "df", "sparse"} assert isinstance(outer.obsm["dense"], np.ndarray) np.testing.assert_equal( outer.obsm["dense"], np.array( [ [0, 1, fill_val], [2, 3, fill_val], [4, 5, fill_val], [0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [4, 5, fill_val], [6, 7, fill_val], ] ), ) assert isinstance(outer.obsm["sparse"], sparse.spmatrix) np.testing.assert_equal( outer.obsm["sparse"].toarray(), np.array( [ [0, 1, fill_val, fill_val], [2, 3, fill_val, fill_val], [4, 5, fill_val, fill_val], [fill_val, fill_val, fill_val, fill_val], [fill_val, fill_val, fill_val, fill_val], [fill_val, fill_val, fill_val, fill_val], [fill_val, fill_val, fill_val, fill_val], [0, 1, 2, 3], [4, 5, 6, 7], ] ), ) # fmt: off true_df = ( pd.concat([a.obsm["df"] for a in obsm_adatas], join="outer") .reset_index(drop=True) ) # fmt: on cur_df = outer.obsm["df"].reset_index(drop=True) pd.testing.assert_frame_equal(true_df, cur_df)
def subset_dim(adata, *, obs=slice(None), var=slice(None)): # Should probably get used for test_inplace_subset_var and test_inplace_subset_obs from anndata._core.index import _subset return _subset(adata, (obs, var))