我想用python创建邻接矩阵

时间:2010-04-14 13:13:50

标签: python

我有非常大的数据集,它几乎是450000行和两行,我想使用python计算邻接矩阵,因为之前我曾尝试在matlab中进行,并且由于数据值较大而显示内存错误。我的数据值也从100开始,最高可达450000,

任何人都可以在这个问题上帮助我,因为我是python的新手。

我必须首先使用Excel工作表或记事本将文件导入python,然后计算邻接矩阵

3 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么您需要的内存比RAM中可用的内存多。即使使用虚拟内存,您也可能无法分配那么大的块。因此,您的解决方案是在构建文件时将邻接矩阵写入文件。此方法适用于MatLab或Python。


我假设您正在处理CAIDA's Router-Level Topology Measurements,因为格式似乎与您的描述相符。此文件的每一行都包含从一个IP路由器(第1列)到另一个(第2列)的图形边缘。假设您只为每个节点使用一个位,192244节点的完整邻接矩阵将需要4.3 GB。我仍然建议将矩阵直接写入文件,而不是在内存中构建它。

答案 1 :(得分:0)

最简单的方法?好吧,如果你有超过10,000个节点,但只有45000个边缘,请使用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。

答案 2 :(得分: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] += 1adjmat[a, b]将返回连接ab

的边数