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

从MatLab导出文件导入图数据到Networkx或NNGT的实现问题

问题原因及解决方案

报错根因

  • 第一次调用nx.read_edgelist返回空图:read_edgelist默认按空白字符分割内容,你的边列表用逗号作为分隔符,未指定分隔符参数导致无法正确识别边。
  • 第二次添加边报错:你调用split()时未指定按逗号分割,每行内容被作为单个字符串存入列表,生成的是单元素列表而非2/3元组,不符合add_edges_from的参数要求。

修正后的边列表导入代码

无权重边导入

import networkx as nx

G = nx.DiGraph()
# 方法1:直接用read_edgelist指定分隔符
G = nx.read_edgelist('sample.txt', delimiter=',', create_using=nx.DiGraph)

# 方法2:手动读取文件添加
with open('sample.txt') as f:
    lines = f.readlines()
edge_list = []
for line in lines:
    line = line.strip()
    if not line:
        continue
    u, v = line.split(',')
    # 如果需要节点为整型,可以加u = int(u), v = int(v)
    edge_list.append((u, v))
G.add_edges_from(edge_list)

带权重边导入

如果你的边列表格式为源节点,目标节点,权重,修改为如下逻辑即可:

# read_edgelist方式
G = nx.read_edgelist('sample.txt', delimiter=',', create_using=nx.DiGraph, data=(('weight', float),))

# 手动读取方式
for line in lines:
    line = line.strip()
    if not line:
        continue
    u, v, w = line.split(',')
    edge_list.append((int(u), int(v), {'weight': float(w)}))

最终需求实现方案

1. 含孤立节点的NNGT有向图构建

不需要提前通过NetworkX中转,直接用NNGT接口实现更简单,可直接指定总节点数,自动保留无关联边的孤立节点:

import nngt
import numpy as np

# 假设你需要的总节点数为100,按实际需求修改
total_nodes = 100
# 先从边列表生成加权邻接矩阵,形状为[total_nodes, total_nodes]
adj_matrix = np.zeros((total_nodes, total_nodes), dtype=float)
with open('sample.txt') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        # 带权重就加第三个参数w
        u, v = map(int, line.split(','))
        # 注意节点编号如果是从1开始的,要减1转为0起始索引
        adj_matrix[u-1][v-1] = 1 # 带权重就替换为float(w)

# 直接生成NNGT有向图,自动保留所有孤立节点
g = nngt.Graph(total_nodes, directed=True, weighted=True)
g.set_adjacency_matrix(adj_matrix)

如果需要从NetworkX转换,补充添加缺失节点后再转换即可:

# 先补全所有节点
all_nodes = list(range(1, total_nodes+1)) # 如果节点是1起始的
G.add_nodes_from(all_nodes)
# 转换为NNGT图
g = nngt.Network.from_networkx(G)

2. 适配MatLab导出格式的导入方案

MatLab支持导出的两种常用格式都可以直接适配:

  • 边列表格式:MatLab将边和权重导出为csv格式的三列数据(源节点、目标节点、权重),用上述代码直接读取即可。
  • 邻接矩阵格式:MatLab将邻接矩阵导出为.mat文件或者csv文件:
    1. 读取.mat文件用scipy.io.loadmat('adj_matrix.mat')直接提取邻接矩阵,传入NNGT的set_adjacency_matrix方法即可。
    2. 读取csv格式邻接矩阵用np.loadtxt('adj_matrix.csv', delimiter=',')提取矩阵后直接传入即可。

内容的提问来源于stack exchange,提问作者Tormey R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:15:04