生物医学网络数据以多种形式出现:数据库导出的边表(STRING、BioGRID、TRRUST)、实验或影像处理流程输出的连接矩阵(脑网络)、桌面软件保存的
GraphML/GEXF 文件、网页可视化使用的
JSON。正确地在这些表示之间转换,是保证后续计算正确的前提。
常见格式
| 格式 |
内容 |
能否保存孤立点 |
能否保存节点/边属性 |
NetworkX 读 / 写 |
适用场合 |
| 边表(edge list,CSV/TSV) |
每行一条边,可带权重列 |
否(需另附节点表) |
边属性可作为列;节点属性需另表 |
read_edgelist /
write_edgelist;from_pandas_edgelist /
to_pandas_edgelist |
数据库导出、最通用的交换格式 |
| 邻接表(adjacency list) |
每行一个节点及其全部邻居 |
是 |
否 |
read_adjlist / write_adjlist |
简单无权图 |
| 邻接矩阵 |
数组 |
是 |
只有一个边权;节点身份靠行列顺序 |
from_numpy_array / to_numpy_array |
脑连接矩阵、相关矩阵、线性代数计算 |
| 稀疏矩阵(SciPy CSR/COO) |
只存非零元 |
是 |
同上 |
from_scipy_sparse_array /
to_scipy_sparse_array |
大规模网络的矩阵运算 |
| GraphML |
XML,带类型声明 |
是 |
是(标量属性) |
read_graphml / write_graphml |
与 Cytoscape、Gephi、igraph、graph-tool 交换 |
| GEXF |
XML,Gephi 原生格式,可含动态信息 |
是 |
是 |
read_gexf / write_gexf |
导入 Gephi 作图 |
| GML |
文本,层级键值 |
是 |
是 |
read_gml / write_gml |
一些经典数据集的发布格式 |
| node-link JSON |
节点列表 + 边列表 |
是 |
是(可 JSON 化的任意属性) |
node_link_data / node_link_graph |
网页可视化(D3.js 等)、Web API |
| Cytoscape JSON |
Cytoscape.js 使用的结构 |
是 |
是 |
cytoscape_data / cytoscape_graph |
与 Cytoscape.js / Cytoscape 交换 |
与 pandas、NumPy、SciPy 互转
- pandas
边表:
nx.from_pandas_edgelist(df, source="protein1", target="protein2", edge_attr=["score"], create_using=nx.Graph);反向用
nx.to_pandas_edgelist(G)。节点属性可另建一张表,用
nx.set_node_attributes(G, df_nodes.set_index("id")["type"].to_dict(), "type")
写入。
- NumPy
矩阵:
A = nx.to_numpy_array(G, nodelist=nodes, weight="weight")。务必显式给出并保存
nodelist:矩阵只靠行列顺序记录节点身份,顺序丢了,矩阵就无法再与基因名或脑区名对应。从矩阵建图用
nx.from_numpy_array(A),再用 nx.relabel_nodes
把整数编号换回名称。
- SciPy
稀疏矩阵:
S = nx.to_scipy_sparse_array(G, nodelist=nodes, format="csr")
返回 SciPy
稀疏数组;无向图的每条边在矩阵中存两次(
与
),所以非零元个数是边数的两倍(自环只存一次)。
- 其他库:igraph 可以用
ig.Graph.from_networkx(G) 与 g.to_networkx()
互转;graph-tool 与 Cytoscape、Gephi 之间最稳妥的交换格式是
GraphML。
读写中的细节
- 标识符:STRING 的蛋白标识形如“物种编号.Ensembl 蛋白
ID”(人类为
9606.ENSP…),需要映射为基因名才能与其他数据对接;映射常是一对多或多对一,要写明规则并报告映射失败的数目。
- 数据类型:从 GraphML 读回时节点 id
一律是字符串,原来的整数节点
1 会变成
"1";与其他数据合并前要统一类型。GraphML
只支持标量属性,列表类属性(例如一个基因所属的多个通路)需要先转成分隔符字符串或改用
JSON。
- 方向与重复:同一条无向边在边表中可能出现两次(A–B
与 B–A),读入
nx.Graph 会自动合并,读入
nx.DiGraph 则成为两条有向边;STRING
的完整下载文件中每对蛋白就是双向各列一次。
- 孤立点:边表天然不含孤立点。若研究问题涉及“某些基因在网络中没有任何连接”(例如疾病基因的网络覆盖率),需要另外维护节点全集。
格式转换后要做往返检查:节点数、边数、权重总和、若干条具体边的属性是否与原始数据一致。代码示例“格式互转”把同一个小网络依次转为边表、稠密矩阵、CSR
稀疏矩阵、GraphML 与 node-link JSON,结果显示:边表往返后孤立点丢失(6
个节点变成 5 个),其余表示保留了全部节点和边;含列表的节点属性写
GraphML 时报错,转为字符串后才能写入。