Scanpy源码浅析之pp.filter_cells

版本

导入Scanpy, 其版本为'1.9.1',如果你看到的源码和下文有差异,其可能是由于版本差异。

import scanpy as sc

sc.__version__
#'1.9.1'

功能

函数pp.filter_cells用于Filter cell outliers, 其源代码在scanpy/preprocessing/_simple.py
其主要功能为过滤异常的细胞。可以根据设置细胞的最大/最小表达量设置阈值,将大于/小于这个阈值的细胞过滤。也可根据细胞表达基因的最大/最小数量设定阈值,将大于/小于这个阈值的细胞给过滤掉。
参数设置:

  • data: AnnData 对象
  • min_counts细胞的最小表达counts
  • min_genes细胞的基因最小表达数目
  • max_counts细胞的最大表达counts
  • max_genes细胞的基因最大表达数目
  • inplace是否在原数据对象上修改

代码解析

主要代码

以下为filter_cells 主要逻辑代码,为方便理解主要逻辑,其中删除了一些即将废弃的,异常处理,日志打印等代码。
[图片上传失败...(image-2e8463-1662902441239)]

参数设置

代码前几行是函数的参数设置:

def filter_cells(
    data: AnnData,
    min_counts: Optional[int] = None,
    min_genes: Optional[int] = None,
    max_counts: Optional[int] = None,
    max_genes: Optional[int] = None,
    inplace: bool = True,
    copy: bool = False,
) -> Optional[Tuple[np.ndarray, np.ndarray]]:

data, min_counts, ..., inplace是函数参数, 冒号后面跟的是参数类型注解,表明这个参数应该传递什么类型的值给函数。

参数使用限制

n_given_options = sum(
    option is not None for option in [min_genes, min_counts, max_genes, max_counts]
)
if n_given_options != 1:
    raise ValueError(
        'Only provide one of the optional parameters `min_counts`, '
        '`min_genes`, `max_counts`, `max_genes` per call.'
    )

上面几行代码, 限定了min_genes, min_counts, max_genes, max_counts,四个参数不能同时使用,调用函数时,只能使用一个。

递归获取结果及处理

if isinstance(data, AnnData):
    adata = data.copy() if copy else data
    # materialize_as_ndarray是用于数据类型转换,并非过滤操作的逻辑代码,可忽略
    cell_subset, number = materialize_as_ndarray(
        filter_cells(adata.X, min_counts, min_genes, max_counts, max_genes)
    )
    if not inplace:
        return cell_subset, number
    if min_genes is None and max_genes is None:
        adata.obs['n_counts'] = number
    else:
        adata.obs['n_genes'] = number
    adata._inplace_subset_obs(cell_subset)
    return adata if copy else None

这部分代码 对输入data 类型做了一个判断, 如果为AnnData, 则将data.X 重新传入filter_cells函数本身来递归调用,得到过滤后的结果。
如果inplace=False, 则直接返回cell_subset, number
否则, 继续在adata操作,根据过滤条件参数, 添加n_counts或者n_genes
然后adata._inplace_subset_obs(cell_subset)是用过滤后的数据取代原来的数据

过滤操作

        
X = data  # proceed with processing the data matrix
min_number = min_counts if min_genes is None else min_genes
max_number = max_counts if max_genes is None else max_genes
number_per_cell = np.sum(
    X if min_genes is None and max_genes is None else X > 0, axis=1
)
# 稀疏矩阵的处理代码
if issparse(X):
    number_per_cell = number_per_cell.A1
if min_number is not None:
    cell_subset = number_per_cell >= min_number
if max_number is not None:
    cell_subset = number_per_cell <= max_number
    
# 返回细胞布尔索引,每个细胞的counts 总和/基因表达数量
return cell_subset, number_per_cell

这部分为实际进行过滤筛选的代码, 其中data不再为初始的AnnData对象的data,而是二次调用传入的adata.X。
下面两行对变量做个统一
min_genes,min_counts 统一为min_number; max_genes,max_genes统一为max_number

min_number = min_counts if min_genes is None else min_genes
max_number = max_counts if max_genes is None else max_genes

如果min_genes或 max_genes都没设置, 则计算每行的total count, 否则则判断基因是否>0,得到真值, 计算每行基因的表达数量。

number_per_cell = np.sum(
    X if min_genes is None and max_genes is None else X > 0, axis=1
)

根据min_number或max_number,进行大小判断,得到cell 行的布尔索引

if min_number is not None:
    cell_subset = number_per_cell >= min_number
if max_number is not None:
    cell_subset = number_per_cell <= max_number

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容