关于 anndata
AnnData 是用于存储和操作带注释数据矩阵的 Python 框架,源自单细胞基因组学,也适用于通用注释数据。它将测量值与观测和变量元数据结合,并支持大数据工作流及 scverse 生态工具。
主要功能
- 01带注释矩阵数据结构
- 02读写多种文件格式
- 03按连接策略合并数据集
- 04筛选和转换数据
- 05支持 backed 模式与稀疏数据
适用场景
- 01存储和处理单细胞 RNA-seq 数据
- 02合并多个实验批次
- 03通过 backed 模式处理大型数据集
- 04为 Scanpy 或 PyTorch 准备数据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill anndata安装后在 Claude Code 中输入/anndata确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/best_practices.mdconcatenation.mddata_structure.mdio_operations.mdmanipulation.md详细介绍
AnnData
概述
AnnData 是一个 Python 包,用于处理带注释的数据矩阵,将实验测量值(X)与观测元数据(obs)、变量元数据(var)以及多维注释(obsm、varm、obsp、varp、uns)一同存储。它最初通过 Scanpy 为单细胞基因组学而设计,如今已成为一个通用框架,可用于高效存储、处理和分析任何需要注释的数据。
何时使用此技能
在以下情况下使用此技能:
- 创建、读取或写入 AnnData 对象
- 使用 h5ad、zarr 或其他基因组学数据格式
- 执行单细胞 RNA-seq 分析
- 使用稀疏矩阵或 backed 模式管理大型数据集
- 拼接多个数据集或实验批次
- 对带注释的数据进行子集选取、筛选或转换
- 与 scanpy、scvi-tools 或 scverse 生态系统中的其他工具集成
安装
uv pip install anndata
# With optional dependencies
uv pip install anndata[dev,test,doc]
快速入门
创建 AnnData 对象
import anndata as ad
import numpy as np
import pandas as pd
# Minimal creation
X = np.random.rand(100, 2000) # 100 cells × 2000 genes
adata = ad.AnnData(X)
# With metadata
obs = pd.DataFrame({
'cell_type': ['T cell', 'B cell'] * 50,
'sample': ['A', 'B'] * 50
}, index=[f'cell_{i}' for i in range(100)])
var = pd.DataFrame({
'gene_name': [f'Gene_{i}' for i in range(2000)]
}, index=[f'ENSG{i:05d}' for i in range(2000)])
adata = ad.AnnData(X=X, obs=obs, var=var)
读取数据
# Read h5ad file
adata = ad.read_h5ad('data.h5ad')
# Read with backed mode (for large files)
adata = ad.read_h5ad('large_data.h5ad', backed='r')
# Read other formats
adata = ad.read_csv('data.csv')
adata = ad.read_loom('data.loom')
adata = ad.read_10x_h5('filtered_feature_bc_matrix.h5')
写入数据
# Write h5ad file
adata.write_h5ad('output.h5ad')
# Write with compression
adata.write_h5ad('output.h5ad', compression='gzip')
# Write other formats
adata.write_zarr('output.zarr')
adata.write_csvs('output_dir/')
基本操作
# Subset by conditions
t_cells = adata[adata.obs['cell_type'] == 'T cell']
# Subset by indices
subset = adata[0:50, 0:100]
# Add metadata
adata.obs['quality_score'] = np.random.rand(adata.n_obs)
adata.var['highly_variable'] = np.random.rand(adata.n_vars) > 0.8
# Access dimensions
print(f"{adata.n_obs} observations × {adata.n_vars} variables")
核心功能
1. 数据结构
了解 AnnData 对象结构,包括 X、obs、var、layers、obsm、varm、obsp、varp、uns 和 raw 组件。
参见:references/data_structure.md,了解以下内容的全面信息:
- 核心组件(X、obs、var、layers、obsm、varm、obsp、varp、uns、raw)
- 从各种来源创建 AnnData 对象
- 访问和处理数据组件
- 高效利用内存的实践
2. 输入/输出操作
读取和写入各种格式的数据,并支持压缩、backed 模式和云存储。
参见:references/io_operations.md,了解以下内容的详细信息:
- 原生格式(h5ad、zarr)
- 其他格式(CSV、MTX、Loom、10X、Excel)
- 用于大型数据集的 backed 模式
- 远程数据访问
- 格式转换
- 性能优化
常用命令:
# Read/write h5ad
adata = ad.read_h5ad('data.h5ad', backed='r')
adata.write_h5ad('output.h5ad', compression='gzip')
# Read 10X data
adata = ad.read_10x_h5('filtered_feature_bc_matrix.h5')
# Read MTX format
adata = ad.read_mtx('matrix.mtx').T
3. 拼接
沿观测或变量维度组合多个 AnnData 对象,并灵活选择连接策略。
参见:references/concatenation.md,全面了解以下内容:
- 基本拼接(axis=0 表示观测,axis=1 表示变量)
- 连接类型(inner、outer)
- 合并策略(same、unique、first、only)
- 使用标签追踪数据来源
- 延迟拼接(AnnCollection)
- 针对大型数据集的磁盘拼接
常用命令:
# Concatenate observations (combine samples)
adata = ad.concat(
[adata1, adata2, adata3],
axis=0,
join='inner',
label='batch',
keys=['batch1', 'batch2', 'batch3']
)
# Concatenate variables (combine modalities)
adata = ad.concat([adata_rna, adata_protein], axis=1)
# Lazy concatenation
from anndata.experimental import AnnCollection
collection = AnnCollection(
['data1.h5ad', 'data2.h5ad'],
join_obs='outer',
label='dataset'
)
4. 数据处理
高效转换、选取子集、筛选和重组数据。
参见:references/manipulation.md,了解以下内容的详细指南:
- 子集选取(按索引、名称、布尔掩码、元数据条件)
- 转置
- 复制(完整副本与视图)
- 重命名(观测、变量、类别)
- 类型转换(字符串转为分类类型、稀疏与稠密转换)
- 添加或移除数据组件
- 重新排序
- 质量控制筛选
常用命令:
# Subset by metadata
filtered = adata[adata.obs['quality_score'] > 0.8]
hv_genes = adata[:, adata.var['highly_variable']]
# Transpose
adata_T = adata.T
# Copy vs view
view = adata[0:100, :] # View (lightweight reference)
copy = adata[0:100, :].copy() # Independent copy
# Convert strings to categoricals
adata.strings_to_categoricals()
5. 最佳实践
遵循建议的模式,以提高内存效率、性能和可复现性。
参见:references/best_practices.md,了解以下方面的指南:
- 内存管理(稀疏矩阵、分类类型、backed 模式)
- 视图与副本
- 数据存储优化
- 性能优化
- 使用原始数据
- 元数据管理
- 可复现性
- 错误处理
- 与其他工具集成
- 常见问题及解决方案
主要建议:
# Use sparse matrices for sparse data
from scipy.sparse import csr_matrix
adata.X = csr_matrix(adata.X)
# Convert strings to categoricals
adata.strings_to_categoricals()
# Use backed mode for large files
adata = ad.read_h5ad('large.h5ad', backed='r')
# Store raw before filtering
adata.raw = adata.copy()
adata = adata[:, adata.var['highly_variable']]
与 Scverse 生态系统集成
AnnData 是 scverse 生态系统的基础数据结构:
Scanpy(单细胞分析)
import scanpy as sc
# Preprocessing
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
# Dimensionality reduction
sc.pp.pca(adata, n_comps=50)
sc.pp.neighbors(adata, n_neighbors=15)
sc.tl.umap(adata)
sc.tl.leiden(adata)
# Visualization
sc.pl.umap(adata, color=['cell_type', 'leiden'])
Muon(多模态数据)
import muon as mu
# Combine RNA and protein data
mdata = mu.MuData({'rna': adata_rna, 'protein': adata_protein})
PyTorch 集成
from anndata.experimental import AnnLoader
# Create DataLoader for deep learning
dataloader = AnnLoader(adata, batch_size=128, shuffle=True)
for batch in dataloader:
X = batch.X
# Train model
常见工作流
单细胞 RNA-seq 分析
import anndata as ad
import scanpy as sc
# 1. Load data
adata = ad.read_10x_h5('filtered_feature_bc_matrix.h5')
# 2. Quality control
adata.obs['n_genes'] = (adata.X > 0).sum(axis=1)
adata.obs['n_counts'] = adata.X.sum(axis=1)
adata = adata[adata.obs['n_genes'] > 200]
adata = adata[adata.obs['n_counts'] < 50000]
# 3. Store raw
adata.raw = adata.copy()
# 4. Normalize and filter
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
adata = adata[:, adata.var['highly_variable']]
# 5. Save processed data
adata.write_h5ad('processed.h5ad')
批次整合
# Load multiple batches
adata1 = ad.read_h5ad('batch1.h5ad')
adata2 = ad.read_h5ad('batch2.h5ad')
adata3 = ad.read_h5ad('batch3.h5ad')
# Concatenate with batch labels
adata = ad.concat(
[adata1, adata2, adata3],
label='batch',
keys=['batch1', 'batch2', 'batch3'],
join='inner'
)
# Apply batch correction
import scanpy as sc
sc.pp.combat(adata, key='batch')
# Continue analysis
sc.pp.pca(adata)
sc.pp.neighbors(adata)
sc.tl.umap(adata)
处理大型数据集
# Open in backed mode
adata = ad.read_h5ad('100GB_dataset.h5ad', backed='r')
# Filter based on metadata (no data loading)
high_quality = adata[adata.obs['quality_score'] > 0.8]
# Load filtered subset
adata_subset = high_quality.to_memory()
# Process subset
process(adata_subset)
# Or process in chunks
chunk_size = 1000
for i in range(0, adata.n_obs, chunk_size):
chunk = adata[i:i+chunk_size, :].to_memory()
process(chunk)
故障排除
内存不足错误
使用 backed 模式或转换为稀疏矩阵:
# Backed mode
adata = ad.read_h5ad('file.h5ad', backed='r')
# Sparse matrices
from scipy.sparse import csr_matrix
adata.X = csr_matrix(adata.X)
文件读取缓慢
使用压缩和合适的格式:
# Optimize for storage
adata.strings_to_categoricals()
adata.write_h5ad('file.h5ad', compression='gzip')
# Use Zarr for cloud storage
adata.write_zarr('file.zarr', chunks=(1000, 1000))
索引对齐问题
始终根据索引对齐外部数据:
# Wrong
adata.obs['new_col'] = external_data['values']
# Correct
adata.obs['new_col'] = external_data.set_index('cell_id').loc[adata.obs_names, 'values']
Additional Resources
- Official documentation: https://anndata.readthedocs.io/
- Scanpy tutorials: https://scanpy.readthedocs.io/
- Scverse ecosystem: https://scverse.org/
- GitHub repository: https://github.com/scverse/anndata