我想用Python创建邻接矩阵

0 投票
3 回答
4902 浏览
提问于 2025-04-15 21:36

我有一个非常大的数据集,差不多有45万行和两列。我想用Python来计算邻接矩阵,因为之前我试着在Matlab里做,但因为数据量太大,出现了内存错误。我的数据值从100开始,一直到45万。

有没有人能帮我解决这个问题,因为我对Python还很陌生。

我需要先把文件导入到Python中,可以用Excel表格或者记事本,然后再计算邻接矩阵。

3 个回答

0

我建议使用defaultdict,因为它简单易用,只需要几行代码。我假设你的文件内容是这样的:

a b
c d

首先,把它放进一个列表中(可以参考这个链接:http://docs.python.org/2/library/fileinput.html),这样格式就变成了[(a, b),(c,d)]。

然后,使用defaultdict:

from collections import defaultdict

adjmat = defaultdict(int)
for edge in list:
    adjmat[edge] = 1

adjmat[a, b] 如果边存在,就会返回1,如果不存在则返回0。如果你在节点之间可以有多条边,只需要把它改成 adjmat[edge] += 1,这样 adjmat[a, b] 就会返回连接 ab 的边的数量。

0

最简单的方法是什么呢?如果你有超过10,000个节点,但只有45,000条边,那就可以使用SciPy的稀疏矩阵。

http://www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7

SciPy提供了多种压缩方法,可以让矩阵在内存中占用更少的空间(因为矩阵中的值大部分都是0)。我相信MatLab也有类似的节省空间的稀疏矩阵数据结构。

如果你只是想知道怎么读取文件,我建议你把它保存为CSV或文本文件(把数据存储在Excel文件里其实没有什么好处)。Python自带一个库可以用来读写CSV文件:

http://docs.python.org/library/csv.html

如果你真的想使用XLS文件,那你可以用pyExcelerator(我自己没用过这个) - http://sourceforge.net/projects/pyexcelerator/ - 或者你可以使用OpenOffice.org + PyUNO,或者MS Office + COM。

1

如果我理解你的问题没错的话,你需要的内存比电脑里的RAM要多。即使有虚拟内存,你可能也无法分配这么大的内存块。所以,解决办法就是在构建邻接矩阵的时候,把它写入一个文件。这种方法在MatLab或Python中都可以使用。


我猜测你在处理CAIDA的路由器级拓扑测量数据,因为这个格式似乎和你描述的很相符。这个文件的每一行都包含了一个图的边,从一个IP路由器(第一列)到另一个(第二列)。如果要为192244个节点创建一个完整的邻接矩阵,假设每个节点只用一个比特,那么需要的内存将达到4.3 GB。我还是建议你直接把矩阵写入文件,而不是在内存中构建它。

撰写回答