版本
導(dǎo)入Scanpy, 其版本為'1.9.1'七婴,如果你看到的源碼和下文有差異春寿,其可能是由于版本差異。
import scanpy as sc
sc.__version__
#'1.9.1'
功能
函數(shù)pp.filter_genes
其源代碼在scanpy/preprocessing/_simple.py
其主要功能為過濾基因≌傧危可以根據(jù)設(shè)置基因的最大/最小表達量設(shè)置閾值大审,將大于/小于這個閾值的基因過濾蘸际。也可根據(jù)基因在細(xì)胞中的最大/最小表達數(shù)量設(shè)定閾值,將大于/小于這個閾值的基因給過濾掉徒扶。
參數(shù)設(shè)置:
-
data
: AnnData 對象 -
min_counts
基因的最小表達counts -
min_cells
基因在細(xì)胞中的最小表達數(shù)目 -
max_counts
基因的最大表達counts -
max_cells
基因在細(xì)胞中的最大表達數(shù)目 -
inplace
是否在原數(shù)據(jù)對象上修改
代碼解析
主要代碼
以下為filter_genes
主要邏輯代碼粮彤,為方便理解主要邏輯,其中刪除了一些即將廢棄的,異常處理导坟,日志打印等代碼屿良。
[圖片上傳失敗...(image-2b627b-1662902487930)]
參數(shù)設(shè)置
代碼前幾行是函數(shù)的參數(shù)設(shè)置:
def filter_genes(
data: AnnData,
min_counts: Optional[int] = None,
min_cells: Optional[int] = None,
max_counts: Optional[int] = None,
max_cells: Optional[int] = None,
inplace: bool = True,
copy: bool = False,
) -> Union[AnnData, None, Tuple[np.ndarray, np.ndarray]]:
data, min_counts, ..., inplace是函數(shù)參數(shù), 冒號后面跟的是參數(shù)類型注解惫周,表明這個參數(shù)應(yīng)該傳遞什么類型的值給函數(shù)尘惧。
參數(shù)使用限制
n_given_options = sum(
option is not None for option in [min_cells, min_counts, max_cells, max_counts]
)
if n_given_options != 1:
raise ValueError(
'Only provide one of the optional parameters `min_counts`, '
'`min_cells`, `max_counts`, `max_cells` per call.'
)
上面幾行代碼, 限定了min_cells, min_counts, max_cells, max_counts递递,四個參數(shù)不能同時使用喷橙,調(diào)用函數(shù)時,只能使用一個登舞。
遞歸獲取結(jié)果及處理
if isinstance(data, AnnData):
adata = data.copy() if copy else data
gene_subset, number = materialize_as_ndarray(
filter_genes(
adata.X,
min_cells=min_cells,
min_counts=min_counts,
max_cells=max_cells,
max_counts=max_counts,
)
)
if not inplace:
return gene_subset, number
if min_cells is None and max_cells is None:
adata.var['n_counts'] = number
else:
adata.var['n_cells'] = number
adata._inplace_subset_var(gene_subset)
return adata if copy else None
這部分代碼 對輸入data 類型做了一個判斷贰逾, 如果為AnnData, 則將adata.X 重新傳入filter_genes
函數(shù)本身來遞歸調(diào)用菠秒,得到過濾后的結(jié)果疙剑。
如果inplace=False, 則直接返回gene_subset, number
否則, 繼續(xù)在adata操作践叠,根據(jù)過濾條件參數(shù)核芽, 添加n_counts或者n_cells
然后adata._inplace_subset_obs(gene_subset)
是用過濾后的數(shù)據(jù)取代原來的數(shù)據(jù)
過濾操作
X = data # proceed with processing the data matrix
min_number = min_counts if min_cells is None else min_cells
max_number = max_counts if max_cells is None else max_cells
number_per_gene = np.sum(
X if min_cells is None and max_cells is None else X > 0, axis=0
)
# 稀疏矩陣的處理代碼
if issparse(X):
number_per_gene = number_per_gene.A1
if min_number is not None:
gene_subset = number_per_gene >= min_number
if max_number is not None:
gene_subset = number_per_gene <= max_number
# 返回基因布爾索引,每個基因的counts 總和/細(xì)胞表達數(shù)量
return gene_subset, number_per_gene
這部分為實際進行過濾篩選的代碼酵熙, 其中data
不再為初始的AnnData對象的data,而是二次調(diào)用傳入的data.X轧简。
下面兩行對變量做個統(tǒng)一
min_cells,min_counts 統(tǒng)一為min_number匾二; max_cells哮独,max_genes統(tǒng)一為max_number
min_number = min_counts if min_cells is None else min_cells
max_number = max_counts if max_cells is None else max_cells
如果min_cells或 max_cells都沒設(shè)置, 則計算每列基因的total count察藐, 否則則判斷基因是否>0皮璧,得到真值, 計算每列基因的細(xì)胞表達數(shù)量。
number_per_gene = np.sum(
X if min_cells is None and max_cells is None else X > 0, axis=0
)
根據(jù)min_number或max_number分飞,進行大小判斷悴务,得到gene過濾的布爾索引
if min_number is not None:
gene_subset = number_per_gene >= min_number
if max_number is not None:
gene_subset = number_per_gene <= max_number