文章目录

  • 简介
  • 安装
  • 初始化AnnData
  • 添加元数据
  • 观察或变量的元数据
  • 非结构化元数据
  • 转换为DataFrame
  • 保存结果
  • 视图和副本
  • 部分读取
  • pytorch模型与anndata接口
  • 惰性连接多个AnnData对象
  • 连接pytorch模型和AnnData对象
  • 命令
    • h5ls
    • h5dump
    • h5diff
    • h5debug
    • h5check
  • h5ad可视化工具
  • AnnData数据结构
  • 参考文献

简介

AnnData ,Annotated Data,是一种类似矩阵的数据,用于单细胞分析,已成为 Python 中该领域的标准数据结构。

AnnData 基于键的存储方式用起来简单,便于可重复性分析,转换为 R 语言的单细胞分析数据结构也十分容易。

假设我们有 nnn 个观测(observations),每个观测可表示为 ddd 维向量,每个维度对应一个变量或特征(variable)。

这个 n×dn \times dn×d 矩阵特殊在于带索引。

安装

pip install anndata

初始化AnnData

  • 使用泊松分布随机生成一个稀疏矩阵,构建 AnnData 对象,表示基因表达数。
  • 构建索引。
  • 构建子集
import numpy as np
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)  # 泊松分布构建稀疏矩阵
adata = ad.AnnData(counts)  # 初始化AnnDataprint(adata)  # 基本统计信息
# AnnData object with n_obs × n_vars = 100 × 2000print(adata.X)  # 访问稀疏矩阵的数据
#   (0, 1)  1.0
#   (0, 3)  1.0
#   (0, 4)  1.0
# ......adata.obs_names = [f'Cell_{i:d}' for i in range(adata.n_obs)]
adata.var_names = [f'Gene_{i:d}' for i in range(adata.n_vars)]
print(adata.obs_names[:5])  # 输出前五个观测名,即X轴
print(adata.var_names[:5])  # 输出前五个特征名,即Y轴
# Index(['Cell_0', 'Cell_1', 'Cell_2', 'Cell_3', 'Cell_4'], dtype='object')
# Index(['Gene_0', 'Gene_1', 'Gene_2', 'Gene_3', 'Gene_4'], dtype='object')print(adata[['Cell_1', 'Cell_10'], ['Gene_5', 'Gene_1900']])  # 构建子集
# View of AnnData object with n_obs × n_vars = 2 × 2

添加元数据

  • 给观察(Observation)或变量(Variable)同一级别添加元数据,adata.obsadata.var 都是 Pandas DataFrames
  • pandas.Categorical():表示经典 R / S-plus 方式的分类变量,可以降低数据存储提升计算速度
  • 使用元数据构造子集
import numpy as np
import pandas as pd
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)ct = np.random.choice(['B', 'T', 'Monocyte'], size=(adata.n_obs,))  # 随机生成cell_type
adata.obs['cell_type'] = pd.Categorical(ct)  # 为了效率,用pd.Categorical()
print(adata.obs)
#    cell_type
# 0          B
# 1   Monocyte
# 2          T
# ......
# [100 rows x 1 columns]print(adata)
# AnnData object with n_obs × n_vars = 100 × 2000
#     obs: 'cell_type'

观察或变量的元数据

  • 可在任何级别上有元数据,如 UMAP 嵌入数据
  • obsmvarm 添加元数据
  • 使用正态分布随机生成一个矩阵作为 UMAP 嵌入数据
  • 元数据可以为 Pandas DataFrames、Scipy 稀疏矩阵、NumPy Array
  • 使用 Scanpy 的话,Columns 不容易绘制,而 .obs 容易绘制
import numpy as np
import pandas as pd
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)ct = np.random.choice(['B', 'T', 'Monocyte'], size=(adata.n_obs,))  # 随机生成cell_type
adata.obs['cell_type'] = pd.Categorical(ct)  # 为了效率,用pd.Categorical()
adata.obsm['X_umap'] = np.random.normal(0, 1, size=(adata.n_obs, 2))
adata.varm['gene_stuff'] = np.random.normal(0, 1, size=(adata.n_vars, 5))print(adata.obsm)
# AxisArrays with keys: X_umap
print(adata)
# AnnData object with n_obs × n_vars = 100 × 2000
#     obs: 'cell_type'
#     obsm: 'X_umap'
#     varm: 'gene_stuff'

非结构化元数据

  • .uns 可存储非结构化元数据,可以是任意数据。
import numpy as np
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)
adata.uns['random'] = [1, 2, 3]
print(adata.uns)
# OverloadedDict, wrapping:
#   OrderedDict([('random', [1, 2, 3])])
# With overloaded keys:
#   ['neighbors'].

  • 可能有不同形式的原始核心数据,如一个标准化一个非标准化,都可以存储在不同层中。
import numpy as np
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)
adata.layers['log_transformed'] = np.log1p(adata.X)
print(adata)
# AnnData object with n_obs × n_vars = 100 × 2000
#     layers: 'log_transformed'

转换为DataFrame

  • 可以将其中一个层转换为 DataFrame
import numpy as np
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)adata.obs_names = [f'Cell_{i:d}' for i in range(adata.n_obs)]
adata.var_names = [f'Gene_{i:d}' for i in range(adata.n_vars)]
adata.layers['log_transformed'] = np.log1p(adata.X)print(adata.to_df(layer='log_transformed'))  # 可以看到保留了索引

保存结果

  • AnnData 对应文件格式为 h5ad
  • 如果包含少量类别的字符串列还不是类别,自动转换为类别。
  • 该“类别”指 CategoricalDtype ,可以降低数据存储提升计算速度
import numpy as np
import pandas as pd
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)adata.obs_names = [f'Cell_{i:d}' for i in range(adata.n_obs)]
adata.var_names = [f'Gene_{i:d}' for i in range(adata.n_vars)]ct = np.random.choice(['B', 'T', 'Monocyte'], size=(adata.n_obs,))
adata.obs['cell_type'] = pd.Categorical(ct)
adata.obsm['X_umap'] = np.random.normal(0, 1, size=(adata.n_obs, 2))
adata.varm['gene_stuff'] = np.random.normal(0, 1, size=(adata.n_vars, 5))
adata.uns['random'] = [1, 2, 3]
adata.layers['log_transformed'] = np.log1p(adata.X)
adata.write('my_results.h5ad', compression='gzip')

在 Linux 下执行命令:h5ls my_results.h5ad

X                        Group
layers                   Group
obs                      Group
obsm                     Group
obsp                     Group
uns                      Group
var                      Group
varm                     Group
varp                     Group

视图和副本

  • 假设观测数据来自一项多年的研究,记录了 10 个读数,样本取自不同地点的不同受试者。
  • 类似于 NumPy Array,AnnData 对象既可以存储真实数据,也可以存储另一个 AnnData 对象的引用。
  • 子集 AnnData 对象总是返回视图,有两个优点——不需要分配新内存、可以修改底层的 AnnData 对象
  • 可以通过 .copy() 获取真实 AnnData 对象。但这样做没什么必要,因为调用 .[] 都会在内部调用 .copy()
  • AnnData 的 [],整型索引类似 pandas 的 .iloc,字符串索引类似 .loc
  • 如果访问 AnnData 视图的某些部分,内容会被自动复制,并生成一个数据存储对象
  • 可以用所有同 pandas 的切片操作,如序列或布尔索引
import numpy as np
import pandas as pd
import anndata as ad
from scipy.sparse import csr_matrixcounts = csr_matrix(np.random.poisson(1, size=(100, 2000)), dtype=np.float32)
adata = ad.AnnData(counts)
adata.obs_names = [f'Cell_{i:d}' for i in range(adata.n_obs)]
adata.var_names = [f'Gene_{i:d}' for i in range(adata.n_vars)]obs_meta = pd.DataFrame({'time_yr': np.random.choice([0, 2, 4, 8], adata.n_obs),'subject_id': np.random.choice(['subject 1', 'subject 2', 'subject 4', 'subject 8'], adata.n_obs),'instrument_type': np.random.choice(['type a', 'type b'], adata.n_obs),'site': np.random.choice(['site x', 'site y'], adata.n_obs),
},index=adata.obs.index,  # 同观测的索引
)
adata = ad.AnnData(adata.X, obs=obs_meta, var=adata.var)  # 构建新的AnnData
print(adata)
# AnnData object with n_obs × n_vars = 100 × 2000
#     obs: 'time_yr', 'subject_id', 'instrument_type', 'site'print(adata[:5, ['Gene_1', 'Gene_3']])  # 生成的是视图
# View of AnnData object with n_obs × n_vars = 5 × 2
#     obs: 'time_yr', 'subject_id', 'instrument_type', 'site'adata_subset = adata[:5, ['Gene_1', 'Gene_3']].copy()  # 全新AnnDataprint(adata[:3, 'Gene_1'].X.toarray().tolist())
adata[:3, 'Gene_1'].X = [0, 0, 0]  # 视图也可以设值
print(adata[:3, 'Gene_1'].X.toarray().tolist())
# [[0.0], [0.0], [0.0]]adata_subset = adata[:3, ['Gene_1', 'Gene_2']]  # 访问视图的某些部分,内容会被自动复制,并生成一个数据存储对象
print(adata_subset)
# View of AnnData object with n_obs × n_vars = 3 × 2
#     obs: 'time_yr', 'subject_id', 'instrument_type', 'site'adata_subset.obs['foo'] = range(3)  # 现在adata_subset不再是adata的引用
print(adata_subset)
# AnnData object with n_obs × n_vars = 3 × 2
#     obs: 'time_yr', 'subject_id', 'instrument_type', 'site', 'foo'print(adata[adata.obs.time_yr.isin([2, 4])].obs.head())

部分读取

如果 h5ad 文件非常大,可以使用 backed 模式部分读入内存

import anndata as adadata = ad.read('my_results.h5ad', backed='r')
print(adata.isbacked)
# Trueprint(adata.filename)
# my_results.h5adadata.file.close()

pytorch模型与anndata接口

惰性连接多个AnnData对象

连接pytorch模型和AnnData对象

命令

h5ls

功能:以指定格式打印数据集信息。

用法:h5ls [OPTIONS] file [OBJECTS...]

参数

简写 全写 功能
-a –address 打印原始数据地址,必须和 -v 或 --verbose 一起使用
-d –data 打印数据集的值
–enable-error-stack 打印错误栈
–follow-symlinks 使用符号链接显示目标对象信息
–no-dangling-links 检查不解析为现有对象的符号链接,必须和 --follow-symlinks 一起使用
-f –full 打印完整路径名称
-g –group 显示组的信息
-l –label 标记复合数据集的成员
-r –recursive 递归列出所有组
-s –string 以 ASCII 格式打印 1 字节数据集
-S –simple 使用机器可读的输出格式
-wN –width=N 设置输出的列数
-v –verbose 生成更多信息
-V –version 打印版本号
–vfd=DRIVER 指定虚拟文件驱动
-x –hexdump 以十六进制格式显示原始数据
OBJECTS 每个对象由一个HDF5文件名(可选地,后面跟着一个斜杠)和文件中的一个对象名称组成(如果文件中没有指定对象,则显示根组的内容)。

常用命令

h5ls x.h5ad  # 查看基础信息h5ls -d x.h5ad/obs/louvain  # 查看/obs/louvain的数据
h5ls -d x.h5ad/obs/__categories/louvain  # 查看/obs/louvain的数据h5ls -d -S x.h5ad/obs/louvain | sort | uniq  # 对/obs/louvain的数据去重
h5ls -d -S x.h5ad/obs/louvain | sort | uniq -c  # 对/obs/louvain的数据去重并显示出现次数

h5dump

功能:显示 HDF5 内容。

用法:h5dump [OPTIONS] file

参数

简写 全写 功能
-h –help 帮助文档
-B –bootblock Print the content of the boot block. (This option is not yet implemented.)
-H –header 标题
-A 属性头和属性值
-i –object-ids 对象ids(貌似是全部打印)
-r –string Print 1-bytes integer datasets as ASCII.
-V –version 版本号
-a P –attribute=P 指定属性
-d P –dataset=P 指定数据集
-f D –filedriver=D Specify which driver to open the file with.
-g P –group=P 指定组
-l P –soft-link=P Print the value(s) of the specified soft link.
-o F –output=F Output raw data into file F.
-t T –datatype=T Print the specified named datatype.
-w N –width=N 输出的列数
-x –xml Output XML using XML schema (default) instead of DDL.
-u –use-dtd Output XML using XML DTD instead of DDL.
-D U –xml-dtd=U In XML output, refer to the DTD or schema at U instead of the default schema/DTD.
-X S –xml-dns=S In XML output, (XML Schema) use qualified names in the XML: “:”: no namespace, default: “hdf5:”
-s L –start=L 子集选择开始的偏移量
-S L –stride=L Hyperslab stride. Default: 1 in all dimensions.
-c L –count=L 块的数量
-k L –block=L Size of block in hyperslab. Default: 1 in all dimensions.
Indicate that all following arguments are non-options. E.g., to dump a file called `-f’, use h5dump – -f.
file The file to be examined.

常用命令

h5dump -H x.h5ad  # 打印标题h5dump -g obs x.h5ad  # 打印Group为obs的数据
h5dump -g /obs/__categories x.h5ad  # 打印Group为obs的数据h5dump -d X -c "10,10" x.h5ad  # 打印Dataset为X的(10, 10)数据h5dump -d /obs/louvain x.h5ad  # 打印/obs/louvain的数据
h5dump -d /obs/louvain -c 100 x.h5ad  # 打印/obs/louvain的数据h5dump -a /obs/_index x.h5ad  # 打印属性

h5diff

功能:比较

h5debug

h5check

h5ad可视化工具

HDFView

AnnData数据结构

  • obs:观察值,如细胞
  • var:变量,特征,如基因
  • X:矩阵,如某基因在细胞里的表达量,X[0] 是第一个细胞的所有基因的表达量,X[:, 0] 是第一个基因在左右细胞的表达量

参考文献

  1. anndata Documentation
  2. UMAP Documentation
  3. Scanpy Documentation
  4. Pandas数据分析从入门到实战
  5. Scanpy(一)AnnData数据结构与一些API用法介绍
  6. HDF5 小试——高大上的多对象文件格式
  7. h5dump: Displays HDF5 file contents
  8. _h5ls GitHub
  9. Linux uniq 命令

Python单细胞分析数据结构——AnnData相关推荐

  1. python怎么分析数据结构_《利用Python进行数据分析》第五章-pandas的数据结构介绍...

    pandas的数据结构介绍 要使用pandas,你首先就得熟悉它的两个主要数据结构:Series和DataFrame.虽然它们并不能解决所有问题,但它们为大多数应用提供了一种可靠的.易于使用的基础. ...

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

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

  3. 单细胞分析的 Python 包 Scanpy(图文详解)

    文章目录 一.安装 二.使用 1.准备工作 2.预处理 过滤低质量细胞样本 3.检测特异性基因 4.主成分分析(Principal component analysis) 5.领域图,聚类图(Neig ...

  4. 如何使用Bioconductor进行单细胞分析?

    最近的技术进步使得能够在单个细胞中分析全基因组特征.但是,单细胞数据为分析提出了独特的挑战,需要开发专用的方法和数据架构才能成功解析数据背后的生物问题.Bioconductor项目托管了社区开发的开源 ...

  5. 单细胞分析Seurat使用相关的10个问题答疑精选!

    NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞测序分析 (重磅综述:三万字长文读 ...

  6. Python中的数据结构

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:磐创AI 概述 在深入研究数据科学和模型构建之前,Pyt ...

  7. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  8. python中定义数据结构_Python中的数据结构。

    python中定义数据结构 I remembered the day when I made up my mind to learn python then the very first things ...

  9. 中科院单细胞分析算法开发博士带你做单细胞转录组分析

    " 福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组和Python课程的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次 ...

最新文章

  1. ACMNO.42 C语言-第几天 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。利用结构体的在最下面
  2. 你还在这样学习Python吗?真的不可以
  3. Maven国内阿里镜像(Maven下载慢的解决方法)
  4. 【转载】目前为止看到描述VSCode编写C++配置文件最清楚的一篇文章
  5. WINCE下调试AT050TN22屏及触摸屏小结
  6. java时间戳转calender_Java获取当前时间,时间戳转换为时间格式 | 学步园
  7. Nutanix公布财报数据 准备IPO前表现抢眼
  8. [分布式训练] 单机多卡的正确打开方式:理论基础
  9. 跟我一起学习C++虚函数--第一篇
  10. 学习笔记(06):MySQL数据库运维与管理-01-用户创建及授权
  11. 基于JAVA+SpringBoot+Mybatis+MYSQL的药房药品管理系统
  12. jmeter脚本录制作业_399
  13. 精心整理的十个必须要知道CSS+DIV技巧
  14. php读取url连接的图片,输出到浏览器
  15. iostream.h和iostream 区别
  16. HDU 4272 LianLianKan(状压DP)题解
  17. ASP.NET课设——新闻发布系统
  18. 百宝,神烦云免费网络验证autojs实例代码
  19. Cent OS (一)Cents OS的基本安装
  20. 由浅入深,全面解析ThreadLocal

热门文章

  1. 为什么我们需要monad?
  2. linux安装node环境
  3. 12V电路电源设计:挑战和降低EMI的技巧
  4. Java指令屏障_指令重排序和内存屏障
  5. Go语言自学系列 | golang for range循环
  6. 【滴滴出行】 2019校招在线笔试
  7. pytorch 中维度(Dimension)概念的理解
  8. Java 寻找指定文件夹里特定字符串
  9. 如何在苹果Mac上将HEIC转换为JPG?
  10. 计算机设备延长线缆传输距离,延长器