在python中创建一个邻接矩阵

时间:2018-09-08 09:05:29

标签: python matrix networkx

我想加载CSV或带符号(加权)图的文本文件,并创建一个邻接矩阵。 CSV文件包含名为“ FromNodeId”,“ ToNodeId”和“ Sign”的三列。 我使用的代码如下:

G = nx.read_edgelist('soc-sign-epinions.txt', data = [('Sign', int)])
#print(G.edges(data = True))

A = nx.adjacency_matrix(G)
print(A.todense())

我遇到了以下错误

ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than 
the maximum possible size

如何解决此问题?请为我建议一种创建邻接矩阵的方法。

1 个答案:

答案 0 :(得分:3)

存储大矩阵所需的内存很容易失控,这就是function f<T>(o: { [key: string]: T }) { console.log(o); } f<number>({a: 1, b: 3}) // ok f<string>({a: 'aa'}) // ok f<string>({a: 'aa', b: 132}) // error - Property 'b' is incompatible with index signature. 返回“稀疏矩阵”的原因,该稀疏矩阵的存储效率更高(利用许多条目将为0)。

由于您的图形具有131000个顶点,因此整个邻接矩阵将使用nx.adjacency_matrix(G)(在Python中,一个整数占用24字节的内存),大约为400GB。但是,您的图的所有边都不到0.01%,换言之,它非常稀疏,稀疏矩阵将为您工作。

为了获得稀疏矩阵,只需使用131000^2 * 24 bytes而不在其后调用A = nx.adjacency_matrix(G)(这将尝试再次正常存储它)。

A.todense()的内置函数可以有效地保存和加载稀疏矩阵,请参见here。例如,要保存稀疏矩阵A,请使用

scipy.sparse

如果使用txt或CSV对您很重要,则必须手动进行操作。这可以通过遍历矩阵的每一行并将其一一写入到文件中来完成:

scipy.sparse.save_npz('filename.npz', A)

这可能需要几分钟才能运行,但应该可以工作(我使用相同大小的路径进行了测试)。