[ PROMPT_NODE_26204 ]
concatenation
[ SKILL_DOCUMENTATION ]
# 合并 AnnData 对象
沿观测值或变量轴合并多个 AnnData 对象。
## 基本合并
### 沿观测值合并(堆叠细胞/样本)
python
import anndata as ad
import numpy as np
# 创建多个 AnnData 对象
adata1 = ad.AnnData(X=np.random.rand(100, 50))
adata2 = ad.AnnData(X=np.random.rand(150, 50))
adata3 = ad.AnnData(X=np.random.rand(200, 50))
# 沿观测值合并 (axis=0, 默认)
adata_combined = ad.concat([adata1, adata2, adata3], axis=0)
print(adata_combined.shape) # (450, 50)
### 沿变量合并(堆叠基因/特征)
python
# 创建具有相同观测值但不同变量的对象
adata1 = ad.AnnData(X=np.random.rand(100, 50))
adata2 = ad.AnnData(X=np.random.rand(100, 30))
adata3 = ad.AnnData(X=np.random.rand(100, 70))
# 沿变量合并 (axis=1)
adata_combined = ad.concat([adata1, adata2, adata3], axis=1)
print(adata_combined.shape) # (100, 150)
## 连接类型
### 内连接 (交集)
仅保留所有对象中都存在的变量/观测值。
python
import pandas as pd
# 创建具有不同变量的对象
adata1 = ad.AnnData(
X=np.random.rand(100, 50),
var=pd.DataFrame(index=[f'Gene_{i}' for i in range(50)])
)
adata2 = ad.AnnData(
X=np.random.rand(150, 60),
var=pd.DataFrame(index=[f'Gene_{i}' for i in range(10, 70)])
)
# 内连接:仅保留基因 10-49 (重叠部分)
adata_inner = ad.concat([adata1, adata2], join='inner')
print(adata_inner.n_vars) # 40 个基因 (重叠)
### 外连接 (并集)
保留所有变量/观测值,并填充缺失值。
python
# 外连接:保留所有基因
adata_outer = ad.concat([adata1, adata2], join='outer')
print(adata_outer.n_vars) # 70 个基因 (并集)
# 缺失值将使用适当的默认值填充:
# - 稀疏矩阵填充为 0
# - 稠密矩阵填充为 NaN
### 外连接的填充值
python
# 为缺失数据指定填充值
adata_filled = ad.concat([adata1, adata2], join='outer', fill_value=0)
## 追踪数据来源
### 添加批次标签
python
# 标记每个观测值来自哪个对象
adata_combined = ad.concat(
[adata1, adata2, adata3],
label='batch', # 标签的列名
keys=['batch1', 'batch2', 'batch3'] # 每个对象的标签
)
print(adata_combined.obs['batch'].value_counts())
# batch1 100
# batch2 150
# batch3 200
### 自动批次标签
python
# 如果未提供 keys