Scanpy源碼淺析之pp.filter_genes

版本

導(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市譬猫,隨后出現(xiàn)的幾起案子讯檐,更是在濱河造成了極大的恐慌,老刑警劉巖染服,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件别洪,死亡現(xiàn)場離奇詭異,居然都是意外死亡柳刮,警方通過查閱死者的電腦和手機挖垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門痒钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痢毒,你說我怎么就攤上這事送矩。” “怎么了哪替?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵益愈,是天一觀的道長。 經(jīng)常有香客問我夷家,道長蒸其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任库快,我火速辦了婚禮摸袁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘义屏。我一直安慰自己靠汁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布闽铐。 她就那樣靜靜地躺著蝶怔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兄墅。 梳的紋絲不亂的頭發(fā)上踢星,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音隙咸,去河邊找鬼沐悦。 笑死,一個胖子當(dāng)著我的面吹牛五督,可吹牛的內(nèi)容都是我干的藏否。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼充包,長吁一口氣:“原來是場噩夢啊……” “哼副签!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起基矮,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤淆储,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后愈捅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遏考,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蓝谨,在試婚紗的時候發(fā)現(xiàn)自己被綠了灌具。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡譬巫,死狀恐怖咖楣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芦昔,我是刑警寧澤诱贿,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站咕缎,受9級特大地震影響珠十,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凭豪,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一焙蹭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫂伞,春花似錦孔厉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拼余,卻和暖如春污桦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匙监。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工寡润, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舅柜。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓梭纹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親致份。 傳聞我的和親對象是個殘疾皇子变抽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容