我想加载带符号(加权)图的 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
如何解决这个问题?请建议我一种创建邻接矩阵的方法。
最佳答案
存储大矩阵所需的内存很容易失控,这就是为什么 nx.adjacency_matrix(G)
返回一个存储效率更高的“稀疏矩阵”(利用那么多条目)将是 0)。
由于你的图有 131000 个顶点,整个邻接矩阵将使用大约 131000^2 * 24 字节
(一个整数在 python 中占用 24 字节内存),大约为 400GB。但是,您的图的所有边数不到 0.01%,换句话说,它非常稀疏,稀疏矩阵将适合您。
为了获得稀疏矩阵,只需使用A = nx.adjacency_matrix(G)
,而无需在其后调用A.todense()
(这会尝试存储它)再次正常)。
scipy.sparse有一个内置函数可以有效地保存和加载稀疏矩阵,参见here 。例如,要保存稀疏矩阵 A,请使用
scipy.sparse.save_npz('文件名.npz', A)
如果使用 txt 或 CSV 对您来说很重要,则必须手动执行。这可以通过迭代矩阵的每一行并将它们一一写入文件来完成:
对于范围内的 i(A.shape[0]):
行 = A.getrow(i).todense()
[使用您喜欢的方法将行写入文件]
这可能需要几分钟才能运行,但应该可以工作(我使用相同大小的路径进行了测试)。
关于python - 在python中创建邻接矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52233719/