Skip to content

Commit

Permalink
Merge pull request #290 from lilab-bcb/fix-sig-background
Browse files Browse the repository at this point in the history
Enforce dense or csr_matrix type for calculate_z_score function
  • Loading branch information
yihming committed Feb 28, 2024
2 parents e5e9c34 + eccf4b7 commit 3a388f7
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 5 deletions.
1 change: 1 addition & 0 deletions pegasus/tools/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
update_rep,
X_from_rep,
W_from_rep,
to_csr_or_dense,
slicing,
calc_mean,
calc_mean_and_var,
Expand Down
8 changes: 4 additions & 4 deletions pegasus/tools/signature_score.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import anndata
from pegasusio import UnimodalData, MultimodalData, timer
from pegasus.tools import calc_mean, calc_sig_background, predefined_signatures, load_signatures_from_file
from pegasus.tools import to_csr_or_dense, calc_mean, calc_sig_background, predefined_signatures, load_signatures_from_file

import logging
logger = logging.getLogger(__name__)
Expand All @@ -16,7 +16,7 @@

def _check_and_calc_sig_background(data: UnimodalData, n_bins: int) -> bool:
if "mean" not in data.var:
data.var["mean"] = calc_mean(data.X, axis = 0)
data.var["mean"] = calc_mean(to_csr_or_dense(data.X),axis = 0)

if data.uns.get("sig_n_bins", 0) != n_bins:
mean_vec = data.var["mean"].values
Expand All @@ -35,7 +35,7 @@ def _check_and_calc_sig_background(data: UnimodalData, n_bins: int) -> bool:
data.var["bins"] = bins

# calculate background expectations
data.obsm["sig_bkg_mean"], data.obsm["sig_bkg_std"] = calc_sig_background(data.X, bins, mean_vec)
data.obsm["sig_bkg_mean"], data.obsm["sig_bkg_std"] = calc_sig_background(to_csr_or_dense(data.X), bins, mean_vec)

return True

Expand Down Expand Up @@ -190,7 +190,7 @@ def calc_signature_score(
del signatures["mito_noncoding"]
elif sig_string.startswith("ribosomal_genes"):
del signatures["ribo_like"]

_calc_sig_scores(data, signatures, show_omitted_genes=show_omitted_genes, skip_threshold=skip_threshold)

if sig_string.startswith("cell_cycle"):
Expand Down
6 changes: 5 additions & 1 deletion pegasus/tools/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np
import pandas as pd
from pandas.api.types import is_categorical_dtype
from scipy.sparse import issparse, csr_matrix
from scipy.sparse import issparse, csr_matrix, csc_matrix
from typing import Union, List, Tuple, Dict
from anndata import AnnData
from pegasusio import UnimodalData, MultimodalData
Expand Down Expand Up @@ -61,6 +61,10 @@ def W_from_rep(
return data.obsp[rep_key]


def to_csr_or_dense(X: Union[csr_matrix, csc_matrix, np.ndarray]) -> Union[csr_matrix, np.ndarray]:
return X if not issparse(X) or isinstance(X, csr_matrix) else X.tocsr()


# slicing is not designed to work at extracting one element, convert to dense matrix
def slicing(X: Union[csr_matrix, np.ndarray], row: Union[List[bool], List[int], int] = slice(None), col: Union[List[bool], List[int], int] = slice(None), copy: bool = False, squeeze: bool = True) -> np.ndarray:
result = X[row, col]
Expand Down

0 comments on commit 3a388f7

Please sign in to comment.