2009-12-21 149 views
7

我有一个大的csv文件,其中列出了图中节点之间的连接。例如:csv稀疏矩阵python

0001,95784
0001,98743
0002,00082
0002,00091

因此,这意味着该节点ID 0001连接到节点95784和98743等。 我需要在numpy中将它读入稀疏矩阵。我怎样才能做到这一点? 我是python的新手,所以这些教程也会有帮助。

+0

你说的 '0001连接到95784',在你想拥有矩阵的条件是什么意思? – kender 2009-12-21 08:44:32

+0

通过这个我的意思是节点(id:0001)有一个定向链接到节点(ID:95784) – 2009-12-21 09:57:34

回答

10

使用lil_matrix SciPy的的(列表矩阵的列表)。实施例。

基于行的链表列表矩阵。

这包含行的列表(self.rows),其中每个列都是非零元素的列索引的排序列表。它还包含这些元素列表的列表(self.data)。

$ cat 1938894-simplified.csv 
0,32 
1,21 
1,23 
1,32 
2,23 
2,53 
2,82 
3,82 
4,46 
5,75 
7,86 
8,28 

代码:

#!/usr/bin/env python 

import csv 
from scipy import sparse 

rows, columns = 10, 100 
matrix = sparse.lil_matrix((rows, columns)) 

csvreader = csv.reader(open('1938894-simplified.csv')) 
for line in csvreader: 
    row, column = map(int, line) 
    matrix.data[row].append(column) 

print matrix.data 

输出:

[[32] [21, 23, 32] [23, 53, 82] [82] [46] [75] [] [86] [28] []] 
+0

正是我需要的。任何可以推荐的优秀的scipy资源? – 2009-12-21 09:54:20

+0

我想http://docs.scipy.org/doc/将是一个起点.. – miku 2009-12-21 09:56:26

+0

一个小问题。 csv中的数字不是指数。他们是IDS即:该文件与 0001001,9304045 0001001,9308122 0001001,9309097 0001001,9311042 0001001,9401139 0001001,9404151 0001001,9407087 0001001,9408099 0001001,9501030 0001001,9503124 开始那么,如何将这些ID转换为数字索引,ID服务器只是识别节点的目的,如果它们是唯一的,它们可能会被替换为等效索引。 我该如何做到这一点。我知道我可以制作与最大ID一样大的行和列,但这看起来很浪费,因为像索引0-1001那样的节点被浪费了。 – 2009-12-21 10:01:24

1

如果你想要一个邻接矩阵,你可以这样做:

from scipy.sparse import * 
from scipy import * 
from numpy import * 
import csv 
S = dok_matrix((10000,10000), dtype=bool) 
f = open("your_file_name") 
reader = csv.reader(f) 
for line in reader: 
    S[int(line[0]),int(line[1])] = True 
1

您可能也有兴趣Networkx,一个纯Python网络/图形软件包。

从网站:

NetworkX是一个Python包的创建,操作和结构,动力学和复杂网络的功能研究。

>>> import networkx as nx 
>>> G=nx.Graph() 
>>> G.add_edge(1,2) 
>>> G.add_node("spam") 
>>> print G.nodes() 
[1, 2, 'spam'] 
>>> print G.edges() 
[(1, 2)]