目录

  • Scanpy简介与安装
  • AnnData
    • AnnData的结构
    • h5ad:AnnData的写入和读取
  • Scanpy中一些常用api的用法介绍
    • sc.pp.filter_cells
    • sc.pp.filter_genes
    • sc.pp.highly_variable_genes
    • sc.pp.normalize_total

Scanpy简介与安装

Scanpy 是一个可扩展的工具包,用于分析与 AnnData(一种数据结构)联合构建的单细胞分析数据。

对于Windows系统,Scanpy的安装最好使用whl文件,首先下载whl文件:scanpy-1.7.2-py3-none-any.whl

通过conda,使用命令cd进入whl文件所在的目录后,然后通过pip安装:

pip install scanpy-1.7.2-py3-none-any.whl

AnnData

AnnData的结构

在scanpy中,我们最常见的数据结构是AnnData,它是一个用于存储数据的对象,其数据结构可以描述如下:

我们把上面这个对象记作 adata,我们需要了解以下几个部分:

功能 类型
adata.X 矩阵 numpy矩阵
adata.obs 观测量 pandas Dataframe
adata.var 特征量 pandas Dataframe
adata.uns 非结构化数据 字典dict

为了进一步了解这个数据结构,我们手动构建一个AnnData对象:

import numpy as np
import pandas as pd
import anndata as ad
from string import ascii_uppercase# 设置观测样本的数量
n_obs=1000
# obs用于保存观测量的信息
obs=pd.DataFrame()# numpy.random.choice(a, size=None, p=None)
# 从a(ndarray, 但必须是一维的)中随机抽取元素, 并组成指定大小(size)的数组
# 数组p: 与数组a对应, 表示取数组a中每个元素的概率, 默认情况下选取每个元素的概率相同
obs['time']=np.random.choice(['day1','day2','day4','day8'],size=n_obs)# 设置特征名var_names
print(ascii_uppercase) # ABCDEFGHIJKLMNOPQRSTUVWXYZ
var_names=[i*letter for i in range(1,10) for letter in ascii_uppercase]
print(var_names)
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', ......, 'X', 'Y', 'Z',
# ......
# 'AAAAAAAAA', 'BBBBBBBBB', 'CCCCCCCCC', ......, 'YYYYYYYYY', 'ZZZZZZZZZ']# 特征数量
n_vars=len(var_names) # 234# 将特征定义到 Dataframe
var=pd.DataFrame(index=var_names)
print(var.head()) # 现在var没有columns(列索引), 只有index(行索引)# 创建数据矩阵 adata.X
X=np.arange(n_obs*n_vars).reshape(n_obs,n_vars)

然后初始化 AnnData 对象,AnnData 对象默认采用数据类型 float32,我们为了便于后期观察打印结果,设置数据类型为 int32:

adata=ad.AnnData(X,obs=obs,var=var,dtype='int32')# 查看数据
print(adata)
"""
AnnData object with n_obs × n_vars = 1000 × 234obs: 'time'
"""# 查看adata的X矩阵
print(adata.X)
"""
[[     0      1      2 ...    231    232    233][   234    235    236 ...    465    466    467][   468    469    470 ...    699    700    701]...[233298 233299 233300 ... 233529 233530 233531][233532 233533 233534 ... 233763 233764 233765][233766 233767 233768 ... 233997 233998 233999]]
"""

一般对于adata.X,行对应观测(即,细胞),列对应特征(即,基因);

我们每次操作 AnnData 时,并不是再新建一个 AnnData 来存储数据,而是直接找到已经在之前初始化好的 AnnData 的内存地址,通过内存地址来直接改变 AnnData 的值。这样做的好处是:

  • 无需分配多余的内存;
  • 可以直接修改已经初始化后的 AnnoData 对象;

比如:

# 查看 'A' 列的头三个元素
print(adata[:3, 'A'].X)
"""
[[  0][234][468]]
"""# 设置 'A' 列的头三个元素
adata[:3, 'A'].X = [0, 0, 0]# 再查看 'A' 列的头五个元素发现值被修改了
print(adata[:5, 'A'].X)
"""
[[  0][  0][  0][702][936]]
"""

但是,如果将 AnnData 对象中的一部分赋值到新对象,该对象会得到一块新内存用于存储实际数据,而不再是对原来adata对象的内存地址引用,比如:

adata_subset = adata[:5, ['A', 'B']]
print(adata_subset)
"""
View of AnnData object with n_obs × n_vars = 5 × 2obs: 'time'
"""# 为新对象 adata_subset 增加观测量 'foo'
adata_subset.obs['foo'] = range(5)
print(adata_subset)
"""
AnnData object with n_obs × n_vars = 5 × 2obs: 'time', 'foo'
"""

h5ad:AnnData的写入和读取

我们可以将AnnData对象通过h5ad文件保存到磁盘中,保存过程如下:

# 计算对象的大小
def print_size_in_MB(x):print('{:.3} MB'.format(x.__sizeof__()/1e6))# 查看对象大小
print_size_in_MB(adata) # 0.187 MB# 查看是否备份
print(adata.isbacked) # False# 设置备份地址
adata.filename = './test.h5ad'# 查看是否备份成功
print(adata.isbacked) # True

adata.isbacked 状态为 True 后,证明对象已经被写入磁盘;

相反的,我们可以利用 scanpy 很方便地读取文件,获得 AnnData 对象:

import scanpy as scMyadata=sc.read('./test.h5ad')
print(Myadata)
"""
AnnData object with n_obs × n_vars = 1000 × 234obs: 'time'
"""

Scanpy中一些常用api的用法介绍

首先导入Scanpy:

import scanpy as sc

sc.pp.filter_cells

sc.pp.filter_cells(data, min_genes=None, max_genes=None)

常常用于预处理中,做一些细胞筛选的工作,该函数保留至少有 min_genes 个基因的细胞,或者保留至多有 max_genes 个基因的细胞;

另外注意,参数 min_genes 和参数 max_genes 不能同时传递;

实例:

# 导入数据
adata=sc.datasets.krumsiek11() # 5类细胞, 640个细胞样本, 共测量11种基因
print(adata)
"""
AnnData object with n_obs × n_vars = 640 × 11obs: 'cell_type'uns: 'iroot', 'highlights'
"""print(adata.n_obs) # 640个细胞# 11个基因(即特征)
print(adata.var_names)
"""
Index(['Gata2', 'Gata1', 'Fog1', 'EKLF', 'Fli1', 'SCL', 'Cebpa', 'Pu.1','cJun', 'EgrNab', 'Gfi1'],dtype='object')
"""### 注意观察细胞数量变化 ###
sc.pp.filter_cells(adata,min_genes=0) # 相当于没有筛选print(adata.n_obs) # 640print(adata.obs)
"""cell_type  n_genes
0    progenitor        9
..          ...      ...
159         Neu        8
"""
print(set(adata.obs['cell_type'].values)) # 5类细胞{'Neu', 'progenitor', 'Ery', 'Mo', 'Mk'}
print(adata.obs['n_genes'].min()) # 4, 每个细胞至少测量了4个基因sc.pp.filter_cells(adata,min_genes=6) # 选择测量了6个基因以上的细胞
print(adata.n_obs) # 630
print(adata.obs['n_genes'].min()) # 6

sc.pp.filter_genes

sc.pp.filter_genes(data, min_cells=None, max_cells=None)

该函数用于保留在至少 min_cells 个细胞中出现的基因,或者保留在至多 max_cells 个细胞中出现的基因;

参数 min_cells 和参数 max_cells 不能同时传递;

对比 sc.pp.filter_cells 可以发现,sc.pp.filter_genes 用于选择基因(筛选列),sc.pp.filter_cells 用于选择细胞(筛选行);

sc.pp.highly_variable_genes

sc.pp.highly_variable_genes(data, n_top_genes=None, min_disp=0.5, max_disp=inf, min_mean=0.0125, max_mean=3)

该函数用于确定高变基因;

常用参数说明:

  • data:AnnData Matrix,行对应细胞列对应基因
  • n_top_genes:要保留的高变基因的数量

sc.pp.normalize_total

sc.pp.normalize_total(adata, target_sum=None, inplace=True)

函数可以对每个细胞进行标准化,以便每个细胞在标准化后沿着基因方向求和具有相同的总数target_sum

实例:

adata.X
array([[ 3.,  3.,  3.,  6.,  6.],[ 1.,  1.,  1.,  2.,  2.],[ 1., 22.,  1.,  2.,  2.]], dtype=float32)
# 设置 target_sum=1 标准化后
X_norm
array([[0.14, 0.14, 0.14, 0.29, 0.29],[0.14, 0.14, 0.14, 0.29, 0.29],[0.04, 0.79, 0.04, 0.07, 0.07]], dtype=float32)

Scanpy(一)AnnData数据结构与一些API用法介绍相关推荐

  1. CompletableFuture API用法介绍(二)

    文章目录 一.纯消费 API 1.thenAccep 2.thenAcceptBoth 3.runAfterBoth 4.thenRun(Runnable action) 二.组合API 1.then ...

  2. CompletableFuture API用法介绍(一)

    文章目录 一.前言 二.CompletableFuture 1.主动完成计算 2.创建异步任务 3.计算完成时对结果的处理 whenComplete/exceptionally/handle 4.结果 ...

  3. 单细胞分析Scanpy(一):Anndata数据结构

    Scanpy是一个分析单细胞转录组数据的python库,AnnData是scanpy的数据存储格式. 一.AnnData数据结构 1.功能介绍 结构 功能 数据类型 adata.X 矩阵数据 unmp ...

  4. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

  5. JavaEE基础(02):Servlet核心API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.核心API简介 1.Servlet执行流程 Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener) ...

  6. TensorRT C++ API用法

    TensorRT C++ API用法 文章目录 TensorRT C++ API用法 1.C++ API vs Python API 2.C++实例TensorRT对象 参考 1.C++ API vs ...

  7. Jinja2安装与基本API用法

    文章目录 简介 前提条件 安装 基本API用法 API 基础 Unicode 高级API 参考文档 简介 Jinja2是用于Python的库,旨在灵活,快速且安全地运行. 前提条件 Jinja2适用于 ...

  8. php 调用微信收货地址,php微信自动获取收货地址api用法实例详解

    这篇文章主要介绍了php版微信自动获取收货地址api用法,结合实例形式分析了php版微信API接口调用与使用技巧,需要的朋友可以参考下 微信公众平台现在是越来越强大了,我们可以通过各种api接口来与平 ...

  9. Unity编辑器AssetDatabase函数API用法中文详解-Chinar教程

    Chinar blog :www.chinar.xin AssetDatabase 函数用法汇总 本文提供全流程,中文翻译 助力快速理解 AssetDatabase API 用法 为初学者节省宝贵的时 ...

最新文章

  1. 【密码学02】密码系统原理及数学背景
  2. Apache服务器错误问题Internal Server Error
  3. linux系统几个重要图
  4. visualvm远程jvm_如何使用VisualVM监视服务器上的多个JVM
  5. C#制作多媒体播放器
  6. 是否要从单片机转为嵌入式Linux?
  7. 基于大数据的房价数据可视化分析预测系统
  8. mac下查看.mobileprovision文件及钥匙串中证书.cer文件
  9. PHP电话号码 区号,中国城市电话区号对照表
  10. 计算机远程控制阀门开启,阀门远程控制系统
  11. 【计算机网络】“三次握手”通俗解释
  12. linux用ping命令测试网速,如何用ping 命令简单测试网速
  13. gedit 编辑器使用教程
  14. python使用selenium爬取dell官网驱动(一):获取遍历各驱动的下载网址
  15. 【AliOS Studio】AliOS Studio初体验
  16. MyBatis 关于order by失效
  17. 如何用python画出一般函数图_python如何画函数图像
  18. 珍惜人生路上的点点滴滴
  19. 有源晶振跟无源晶振哪里不同
  20. Unity新手适合的简单AI

热门文章

  1. ActiveMQ高级特性
  2. 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了!
  3. 搞不懂为啥都要去字节跳动,进阿里不香吗?
  4. 如图两道面试题,顺便深入线程池,并连环17问
  5. 搞一个短信验证码登录,难吗?四步搞定!
  6. 如何基于消息中间件实现分布式事务?万字长文给你答案!!
  7. 拜托,别再问我贪心算法了!
  8. 典型云平台技术栈有哪些?
  9. 一头扎进tomcat
  10. 【重磅】助力企业复工,飞书宣布为中小企业提供三年免费服务