scanpy 单细胞分析包图文详解 01 | 深入理解 AnnData 数据结构

一、环境准备:

搭建 Python 高效开发环境: Pycharm + Anaconda

二、安装 scanpy

pip install scanpy

三、AnnData

1、AnnData 介绍与结构

AnnData 是用于存储数据的对象,一般作为 scanpy 的数据存储格式。

image.png

主要由以下几部分构成:

功能数据类型
adata.X矩阵数据numpy,scipy sparse,matrix
adata.obs观察值数据pandas dataframe
adata.var特征和高可变基因数据pandas dataframe
adata.uns非结构化数据dict

下面我们动手构建一个用于创建 AnnoData 的虚拟数据

import numpy as np
import pandas as pd
import anndata as ad
from string import ascii_uppercase

# 设置观测值数量
n_obs = 1000
# 生成观察时间
obs = pd.DataFrame()
obs['time'] = np.random.choice(['day 1', 'day 2', 'day 4', 'day 8'], n_obs)
# 设置特征名
var_names = [i*letter for i in range(1, 10) for letter in ascii_uppercase]
# 特征数量
n_vars = len(var_names)
# 特征注释数据框
var = pd.DataFrame(index=var_names)
# 生成数据矩阵
X = np.arange(n_obs*n_vars).reshape(n_obs, n_vars)
2、AnnoData 初始化
# 初始化 AnnoData 对象
# AnnoData 对象默认使用数据类型为 `float32`, 可以更精确的存储数据
# 这里设置为整数,为了演示方便
adata = ad.AnnData(X, obs=obs, var=var, dtype='int32')
# 一般默认将变量或特征存储在数据框的行
# 查看数据
print(adata)
image.png
3、AnnoData 切片特性

可以看到 AnnData 具有和 dataframe 或 Array 相似的长相,同样具备相似的特性,比如切片:

# 通过切片查看观测值和变量
print(adata.obs_names[:10].tolist())
print(adata.obs_names[-10:].tolist())
print(adata.var_names[:10].tolist())
print(adata.var_names[-10:].tolist())
# 查看矩阵
print(X)

image.png

3、AnnoData 的 view 特性

AnnoData 可以实现与 numpy 中的 view 相似的功能。

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

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

view 可以使用 .copy() 来得到 AnnoData 对象。

# 查看 'A' 列的头三个元素
print(adata[:3, 'A'].X)
# 设置 'A' 列的头三个元素
adata[:3, 'A'].X = [0, 0, 0]
# 查看 'A' 列的头五个元素
print(adata[:5, 'A'].X)
image.png

其实我们在调用 .[] 时,AnnoData已经在内部实现了该操作,也就是说该 view 会成为保存数据的 AnnoData 对象。

但是,如果将 AnnoData 对象的 view 中的一部分赋值,该内容会复制一份并生成新的数据存储对象。

adata_subset = adata[:5, ['A', 'B']]
print(adata_subset)
adata_subset.obs['foo'] = range(5)
image.png

可以看到,这时赋值会直接将 AnnoData 对象复制一份。现在 adata_subset 会重新得到一块内存用于存储实际数据,而不再仅仅是对 adata 的内存地址引用。

4、备份到本地
# 计算对象大小的函数
def print_size_in_MB(x):
    print('{:.3} MB'.format(x.__sizeof__()/1e6))
# 查看 adata 对象大小
print_size_in_MB(adata)
# 查看是否备份
adata.isbacked
# 设置备份地址
adata.filename = './write/test.h5ad'
# 查看是否备份成功
adata.isbacked
image.png

可以看到,我们的 adata 对象已经备份成功,而且就在本地 ‘./write/test.h5ad’ 目录。

前边提到的 view 特性在这里同样适用,我们来看看 adata_subset 是否备份成功。

adata_subset.isbacked
adata_subset.filename = './write/adata_subset_test.h5ad'
adata_subset.isbacked

image.png

adata_subset 并没有被启用备份模式,重新设置备份模式。

需要注意的是:备份仅影响数据矩阵 X,所有注释信息都保留在内存中。如果想对全部数据的更改保存,则必须将导出到本地。

5、导出到本地
adata.write("./write/my_results.h5ad")
adata.write_csvs('./write/my_results_csvs', )
6、读取数据
import scanpy as sc
import pandas as pd

# 初始化数据
adata = sc.read(filename)
# 加入数据
anno = pd.read_csv(filename_sample_annotation)
# 加入样本分组信息
adata.obs['cell_groups'] = anno['cell_groups']  # categorical annotation of type pandas.Categorical
# 加入时间信息
adata.obs['time'] = anno['time']                # numerical annotation of type float
# 甚至可以直接赋值 dataframe
adata.obs = anno

官网:https://anndata.readthedocs.io/en/latest/

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
K3wise数据表是一种用于存储和组织数据的图形化工具。它通常用于在电子表格软件中创建和管理各种类型的数据表格。使用K3wise数据表可以轻松地记录、跟踪和分析数据。 首先,K3wise数据表的主要特点是它的图形化界面。通过简单的拖拽和放置,用户可以轻松地创建表格,并设置各个列的名称和属性。这使得数据表的设计和构建变得非常直观和简单。 其次,K3wise数据表提供了丰富的功能来管理数据。用户可以通过添加、删除、编辑和排序表格中的行来持续更新数据。此外,用户还可以使用筛选器来快速查找特定条件下的数据。这些功能使得数据的更新和整理变得高效和便捷。 此外,K3wise数据表还具有数据分析的功能。通过使用各种内置的公式和计算功能,用户可以对数据进行各种统计和计算操作。例如,用户可以计算表格中某一列的总和、平均值、最大值和最小值等。这些功能可以帮助用户更好地理解和分析数据。 最后,K3wise数据表还具备数据分享和协作的能力。用户可以将表格导出为不同格式的文件,并将其分享给其他人。同时,多个用户可以同时对同一个数据表进行编辑和更新。这使得团队成员之间的合作变得更加高效和方便。 总的来说,K3wise数据表是一种强大的图形化工具,可用于创建、管理和分析数据表格。它的简单和直观的界面,丰富的功能以及数据分享和协作的能力,使得使用者可以更轻松地处理和使用数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白墨石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值