2017-04-16 58 views
0

拉普拉斯矩阵我有一个数据集为以下,其中第一和第二列表示从节点到连接:生成从非正方形数据集

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

看起来您需要将您的节点/边数据集处理为所需的格式 - 从文档,[图表复制](https://docs.scipy.org/doc/scipy/reference/sparse.csgraph.html#图表表示) – wwii

回答

1

与其查找除您的数据以外的函数,请将数据处理为正确的格式。

假数据f模拟文件对象。对于Python 3.6使用io.StringIO

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)) 

找到最高点,创建基于最高节点数量 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 

当然这两个的假设所有的边缘的权重相等。


请参阅Graph Representations在scipy文档。我无法尝试此图表来查看它是否有效,我得到一个导入错误csgraph - 可能需要更新。

+0

你可以使用'z [:,0]',而不是'zT [0]',但更好的是:你可以解压为'rows,columns = zT'我想。 –

+0

啊,是的,......行,列的赋值是事后的想法,我原来在下一行有'''z.T'''切片。有趣的是,你如何错过这样的事情。日Thnx。 – wwii