[ PROMPT_NODE_26202 ]
best_practices
[ SKILL_DOCUMENTATION ]
# 最佳实践
高效且有效地使用 AnnData 的指南。
## 内存管理
### 对稀疏数据使用稀疏矩阵
python
import numpy as np
from scipy.sparse import csr_matrix
import anndata as ad
# 检查数据稀疏性
data = np.random.rand(1000, 2000)
sparsity = 1 - np.count_nonzero(data) / data.size
print(f"稀疏度: {sparsity:.2%}")
# 如果零值超过 50%,则转换为稀疏矩阵
if sparsity > 0.5:
adata = ad.AnnData(X=csr_matrix(data))
else:
adata = ad.AnnData(X=data)
# 优势:对于稀疏基因组数据,内存减少 10-100 倍
### 将字符串转换为分类类型 (Categoricals)
python
# 低效:字符串列占用大量内存
adata.obs['cell_type'] = ['Type_A', 'Type_B', 'Type_C'] * 333 + ['Type_A']
# 高效:转换为分类类型
adata.obs['cell_type'] = adata.obs['cell_type'].astype('category')
# 转换所有字符串列
adata.strings_to_categoricals()
# 优势:对于重复字符串,内存减少 10-50 倍
### 对大数据集使用后端模式 (Backed mode)
python
# 不要将整个数据集加载到内存中
adata = ad.read_h5ad('large_dataset.h5ad', backed='r')
# 处理元数据
filtered = adata[adata.obs['quality'] > 0.8]
# 仅加载过滤后的子集
adata_subset = filtered.to_memory()
# 优势:处理大于 RAM 的数据集
## 视图 (Views) 与副本 (Copies)
### 理解视图
python
# 默认情况下,子集化会创建视图
subset = adata[0:100, :]
print(subset.is_view) # True
# 视图不复制数据(内存高效)
# 但修改可能会影响原始数据
# 检查对象是否为视图
if adata.is_view:
adata = adata.copy() # 使其独立
### 何时使用视图
python
# 好:对子集进行只读操作
mean_expr = adata[adata.obs['cell_type'] == 'T cell'].X.mean()
# 好:临时分析
temp_subset = adata[:100, :]
result = analyze(temp_subset.X)
### 何时使用副本
python
# 创建独立副本以进行修改
adata_filtered = adata[keep_cells, :].copy()
# 修改时不会影响原始数据
adata_filtered.obs['new_column'] = values
# 在以下情况务必复制:
# - 存储子集以供后续使用
# - 修改子集数据
# - 传递给修改数据的函数
## 数据存储最佳实践
### 选择正确的格式
**H5AD (HDF5) - 默认选择**
python
adata.write_h5ad('data.h5ad', compression='gzip')
- 快速随机访问
- 支持后端模式
- 良好的压缩
- 最适合:大多数使用场景
**Zarr - 云端和并行访问**
python
adata.write_zar