python - 在python中创建邻接矩阵

标签 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

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

最佳答案

存储大矩阵所需的内存很容易失控,这就是为什么 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/

相关文章:

python - 使用 Scikit-learn 中的 Column Transformer 时如何找出 StandardScaling 参数 .mean_ 和 .scale_?

python - 将带有时区的日期格式更改为 yyyy-mm-dd hh :mm:ss

Java,行和列的总和

python - 尝试使用 "pyinstaller <scriptname.py>"并得到 "TypeError: an integer is required (got type bytes)"

c - 为什么这个矩阵初始化为 2x4 而不是 2x2?

tensorflow - 检查 Tensorflow(批处理版本)中张量列表中存在的值的好方法是什么?

python - Networkx Graph 获取每个节点的序列号

python - Pygraphviz xlabel 位置和颜色不起作用

r - 如何将 Networkx Graph 转换为 igraph 对象(从 python 到 R)

python - 根据共享列的另一个数据框中的列映射 pandas 数据框中的新列