我有一个数据集如下所示,其中第一列和第二列表示节点连接到:
fromNode toNode
0 1
0 2
0 31
0 73
1 3
1 56
2 10
...
我想从这个数据集中生成拉普拉斯矩阵。我使用以下代码来执行此操作,但它抱怨因为数据集本身不是方形矩阵。是否有一个函数接受这种类型的数据集并生成矩阵?
from numpy import genfromtxt
from scipy.sparse import csgraph
import csv
G = genfromtxt('./data.csv', delimiter='\t').astype(int)
dataset = csgraph.laplacian(G, normed=False)
答案 0 :(得分:1)
不是找到除数据之外的函数,而是将数据处理成正确的格式。
假数据f
模拟文件对象。将io.StringIO
用于Python 3.6。
data = '''0 1
0 2
0 31
0 73
1 3
1 56
2 10'''
f = io.BytesIO(data)
读取数据的每一行,并将其处理为(node1, node1)
形式的边列表。
edges = []
for line in f:
line = line.strip()
(node1, node2) = map(int, line.split())
edges.append((node1,node2))
找到最高节点 number ,根据最高节点编号创建 square numpy ndarray。您需要知道您的节点编号 - 是否为零?
N = max(x for edge in edges for x in edge)
G = np.zeros((N+1,N+1), dtype = np.int64)
迭代边缘并将边缘权重分配给图形
for row, column in edges:
G[row,column] = 1
以下是使用numpy integer array indexing的解决方案。
z = np.genfromtxt(f, dtype = np.int64)
n = z.max() + 1
g = np.zeros((n,n), dtype = np.int64)
rows, columns = z.T
g[rows, columns] = 1
当然,这两个都假设所有边权重相等。
请参阅scipy文档中的Graph Representations。我无法尝试此图表以查看它是否有效,我收到csgraph
的导入错误 - 可能需要更新。