从非方形数据集生成拉普拉斯矩阵

时间:2017-04-16 15:24:39

标签: python

我有一个数据集如下所示,其中第一列和第二列表示节点连接到:

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)

1 个答案:

答案 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的导入错误 - 可能需要更新。