Skip to content

Commit e6c158a

Browse files
authored
Add 3d integer matrices, string and boolean matrices (#17)
* Generate 3d float matrix * Add more nd matrices * Fix merge typo
1 parent eb9d493 commit e6c158a

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

src/dummy_anndata/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from importlib.metadata import version
22

33
from .generate_vector import generate_vector, vector_generators
4-
from .generate_matrix import generate_matrix, matrix_generators
4+
from .generate_matrix import generate_matrix, matrix_generators, extra_uns_matrix_generators
55
from .generate_dict import generate_scalar, generate_dict, scalar_generators
66
from .generate_dataframe import generate_dataframe
77
from .generate_dataset import generate_dataset
@@ -15,6 +15,7 @@
1515
"generate_dataset",
1616
"vector_generators",
1717
"matrix_generators",
18+
"extra_uns_matrix_generators",
1819
"scalar_generators"
1920
]
2021

src/dummy_anndata/generate_dataset.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from .generate_dataframe import generate_dataframe
66
from .generate_dict import generate_dict, scalar_generators
7-
from .generate_matrix import matrix_generators
7+
from .generate_matrix import matrix_generators, extra_uns_matrix_generators
88
from .generate_vector import vector_generators
99

1010

@@ -52,10 +52,11 @@ def generate_dataset(
5252
varp_types : list of str, optional
5353
Types of matrices to generate for `varp`. Each type must be a key in `matrix_generators`.
5454
uns_types : list of str, optional
55-
Types of data to generate for `uns`. Each type must be a key in `vector_generators`, `matrix_generators`, or `scalar_generators`.
55+
Types of data to generate for `uns`. Each type must be a key in `vector_generators`, `matrix_generators`, or `scalar_generators`
56+
or `extra_uns_matrix_generators`.
5657
nested_uns_types : list of str, optional
5758
Types of data to generate for the nested `uns` dictionary. They will be a new dictionary at the key `nested`.
58-
Each type must be a key in `vector_generators`, `matrix_generators`, or `scalar_generators`.
59+
Each type must be a key in `vector_generators`, `matrix_generators`, or `scalar_generators` or `extra_uns_matrix_generators`.
5960
6061
Returns
6162
-------
@@ -128,10 +129,10 @@ def generate_dataset(
128129
if varp_types is None: # varp_types are all matrices
129130
varp_types = list(matrix_generators.keys())
130131
if uns_types is None:
131-
uns_types = list(vector_generators.keys()) + list(matrix_generators.keys()) + list(scalar_generators.keys())
132+
uns_types = list(vector_generators.keys()) + list(matrix_generators.keys()) + list(scalar_generators.keys()) + list(extra_uns_matrix_generators.keys())
132133
if nested_uns_types is None:
133134
nested_uns_types = (
134-
list(vector_generators.keys()) + list(matrix_generators.keys()) + list(scalar_generators.keys())
135+
list(vector_generators.keys()) + list(matrix_generators.keys()) + list(scalar_generators.keys()) + list(extra_uns_matrix_generators.keys())
135136
)
136137

137138
X = None

src/dummy_anndata/generate_dict.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import Union
44

5-
from .generate_matrix import matrix_generators, generated_matrix_types
5+
from .generate_matrix import matrix_generators, generated_matrix_types, extra_uns_matrix_generators
66
from .generate_vector import vector_generators, generated_vector_types
77
from .generate_dataframe import generate_dataframe
88

@@ -32,6 +32,8 @@ def generate_type(type, n_rows, n_cols):
3232
return vector_generators[type](n_rows)
3333
if type in matrix_generators:
3434
return matrix_generators[type](n_rows, n_cols)
35+
if type in extra_uns_matrix_generators:
36+
return extra_uns_matrix_generators[type](n_rows, n_cols)
3537
return None
3638

3739
all_types = generated_scalar_types | generated_vector_types | generated_matrix_types

src/dummy_anndata/generate_matrix.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ def float_mtx(n_obs, n_vars, NAs=False):
99
mtx[0, 0] = np.nan
1010
return mtx
1111

12-
1312
def int_mtx(n_obs, n_vars):
1413
mtx = np.arange(n_obs * n_vars).reshape(n_obs, n_vars)
1514
return mtx
@@ -21,6 +20,20 @@ def float_mtx_nd(nr_values, dimensions, NAs=False):
2120
mtx[0, 0] = np.nan
2221
return mtx
2322

23+
def int_mtx_nd(nr_values, dimensions, NAs=False):
24+
mtx = np.arange(nr_values).reshape(dimensions)
25+
if NAs: # numpy matrices do no support pd.NA
26+
mtx[0, 0] = np.nan
27+
return mtx
28+
29+
def float_mtx_sparse_nd(nr_values, dimensions, row_major=True, NAs=False):
30+
mtx = float_mtx_nd(nr_values, dimensions, NAs)
31+
if row_major:
32+
return sp.sparse.csr_matrix(mtx)
33+
else:
34+
return sp.sparse.csc_matrix(mtx)
35+
36+
2437
# Possible matrix generators
2538
# integer matrices do not support NAs in Python
2639
matrix_generators = {
@@ -34,6 +47,20 @@ def float_mtx_nd(nr_values, dimensions, NAs=False):
3447
"integer_csparse": lambda n_obs, n_vars: sp.sparse.csc_matrix(int_mtx(n_obs, n_vars)),
3548
"integer_rsparse": lambda n_obs, n_vars: sp.sparse.csr_matrix(int_mtx(n_obs, n_vars)),
3649
"float_matrix_3d": lambda n_obs, n_vars: float_mtx_nd(n_obs * n_vars * 3, (n_obs, n_vars, 3)),
50+
"integer_matrix_3d": lambda n_obs, n_vars: int_mtx_nd(n_obs * n_vars * 3, (n_obs, n_vars, 3)),
51+
}
52+
53+
def string_matrix_nd(nr_values, dimensions):
54+
return np.array(['a' for _ in range(nr_values)]).reshape(dimensions)
55+
56+
def bool_matrix_nd(nr_values, dimensions):
57+
return np.array([True if i % 2 else False for i in range(nr_values)]).reshape(dimensions)
58+
59+
extra_uns_matrix_generators = {
60+
"string_matrix": lambda n_obs, n_vars: np.array(['a' for _ in range(n_obs * n_vars)]).reshape(n_obs, n_vars),
61+
"bool_matrix": lambda n_obs, n_vars: np.array([True for _ in range(n_obs * n_vars)]).reshape(n_obs, n_vars),
62+
"string_matrix_3d": lambda n_obs, n_vars: string_matrix_nd(n_obs * n_vars * 3, (n_obs, n_vars, 3)),
63+
"bool_matrix_3d": lambda n_obs, n_vars: bool_matrix_nd(n_obs * n_vars * 3, (n_obs, n_vars, 3)),
3764
}
3865

3966
generated_matrix_types = np.ndarray | sp.sparse.csc_matrix | sp.sparse.csr_matrix
@@ -58,6 +85,10 @@ def generate_matrix(n_obs: int, n_vars: int, matrix_type: str) -> generated_matr
5885
AssertionError: If the matrix_type is unknown.
5986
6087
"""
61-
assert matrix_type in matrix_generators, f"Unknown matrix type: {matrix_type}"
88+
assert matrix_type in matrix_generators.keys() or matrix_type in extra_uns_matrix_generators.keys(), f"Unknown matrix type: {matrix_type}"
89+
90+
if matrix_type in matrix_generators:
91+
return matrix_generators[matrix_type](n_obs, n_vars)
92+
else:
93+
return extra_uns_matrix_generators[matrix_type](n_obs, n_vars)
6294

63-
return matrix_generators[matrix_type](n_obs, n_vars)

0 commit comments

Comments
 (0)