You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义格式的二维稀疏矩阵转换为igraph或network对象?

我经常处理这类稀疏邻接矩阵转图分析对象的需求,给你分享两个常用工具的高效实现方案,步骤清晰且性能不错:

Python 实现(基于igraph)

首先确保安装了python-igraph:

pip install python-igraph

核心思路是先把原始文本解析成边三元组列表(源节点、目标节点、权重),再用igraph的内置方法快速构建图对象:

import igraph as ig

# 原始数据(如果是从文件读取,替换成 open("your_file.txt").read() 即可)
raw_data = """1 2:1.827411e-02 3:5.355330e-02 4:1.827411e-02 5:1.827411e-02 2 1:1.827411e-02 3:1.903553e-02 4:4.568528e-03 5:4.568528e-03 3 1:5.355330e-02 2:1.903553e-02 4:1.903553e-02 5:1.903553e-02 6:7.461929e-02 11:3.350254e-02 4 1:1.827411e-02 2:4.568528e-03 3:1.903553e-02 5:4.568528e-03 5 1:1.827411e-02 2:4.568528e-03 3:1.903553e-02 4:4.568528e-03 6 3:7.461929e-02 7:1.903553e-02 8:1.903553e-02 9:5.355330e-02 10:1.903553e-02 11:3.350254e-02 7 6:1.903553e-02 8:4.568528e-03 9:1.827411e-02 10:4.568528e-03 8 6:1.903553e-02 7:4.568528e-03 9:1.827411e-02 10:4.568528e-03 9 6:5.355330e-02 7:1.827411e-02 8:1.827411e-02 10:1.827411e-02 10 6:1.903553e-02 7:4.568528e-03 8:4.568528e-03 9:1.827411e-02 11 3:3.350254e-02 6:3.350254e-02"""

# 高效解析成边列表和权重列表
edges = []
weights = []
tokens = raw_data.split()
i = 0
total_tokens = len(tokens)

while i < total_tokens:
    source = int(tokens[i])
    i += 1
    # 遍历当前节点的所有边,直到遇到下一个节点(无冒号的token)
    while i < total_tokens and ':' in tokens[i]:
        target_str, weight_str = tokens[i].split(':')
        edges.append((source, int(target_str)))
        weights.append(float(weight_str))
        i += 1

# 构建图对象(directed=False表示无向图,有向图则去掉该参数)
g = ig.Graph.TupleList(edges, weights=weights, directed=False)

# 验证示例:查看节点1的邻居及对应权重
for neighbor_idx in g.neighbors(1):
    neighbor_node = g.vs[neighbor_idx]['name']
    edge_id = g.get_eid(1, neighbor_node)
    print(f"节点1与节点{neighbor_node}的权重为{g.es[edge_id]['weight']}")

R 实现(igraph/network)

基于igraph包

先安装依赖:

install.packages("igraph")

同样先解析成边数据框,再用igraph的内置方法构建图:

library(igraph)

# 原始数据(从文件读取的话,可用 raw_data <- readLines("your_file.txt") %>% paste(collapse=" "))
raw_data <- "1 2:1.827411e-02 3:5.355330e-02 4:1.827411e-02 5:1.827411e-02 2 1:1.827411e-02 3:1.903553e-02 4:4.568528e-03 5:4.568528e-03 3 1:5.355330e-02 2:1.903553e-02 4:1.903553e-02 5:1.903553e-02 6:7.461929e-02 11:3.350254e-02 4 1:1.827411e-02 2:4.568528e-03 3:1.903553e-02 5:4.568528e-03 5 1:1.827411e-02 2:4.568528e-03 3:1.903553e-02 4:4.568528e-03 6 3:7.461929e-02 7:1.903553e-02 8:1.903553e-02 9:5.355330e-02 10:1.903553e-02 11:3.350254e-02 7 6:1.903553e-02 8:4.568528e-03 9:1.827411e-02 10:4.568528e-03 8 6:1.903553e-02 7:4.568528e-03 9:1.827411e-02 10:4.568528e-03 9 6:5.355330e-02 7:1.827411e-02 8:1.827411e-02 10:1.827411e-02 10 6:1.903553e-02 7:4.568528e-03 8:4.568528e-03 9:1.827411e-02 11 3:3.350254e-02 6:3.350254e-02"

# 解析成边数据框
tokens <- strsplit(raw_data, " ")[[1]]
edges_df <- data.frame(source = integer(), target = integer(), weight = numeric())
i <- 1
total_tokens <- length(tokens)

while (i <= total_tokens) {
  source <- as.integer(tokens[i])
  i <- i + 1
  while (i <= total_tokens && grepl(":", tokens[i])) {
    edge_part <- strsplit(tokens[i], ":")[[1]]
    edges_df <- rbind(edges_df, data.frame(
      source = source,
      target = as.integer(edge_part[1]),
      weight = as.numeric(edge_part[2])
    ))
    i <- i + 1
  }
}

# 构建无向图(directed=TRUE则为有向图)
g <- graph_from_data_frame(edges_df, directed = FALSE)

# 验证示例:查看节点1的所有边及权重
E(g)[from(V(g)[name == "1"])]

基于network包

如果习惯用network对象,可参考以下代码:

install.packages("network")
library(network)

# 使用上面解析好的edges_df
net <- network(edges_df[, c("source", "target")], directed = FALSE)
# 为边添加权重属性
set.edge.attribute(net, "weight", edges_df$weight)

# 验证示例:查看节点1的边权重
get.edge.attribute(net, "weight", eid = get.edgeIDs(net, v = 1))

性能提示

  • 解析阶段用逐token遍历的方式,避免一次性加载大量冗余数据,适合处理大规模稀疏矩阵;
  • igraph的内置构建方法都是底层优化过的,比手动逐个添加节点/边效率高很多;
  • 如果你的数据是对称无向的,可以在解析时只保留单向边,进一步减少内存占用。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:38:47