我有一个大的csv文件,其中列出了图中节点之间的连接。例如:csv稀疏矩阵python
0001,95784
0001,98743
0002,00082
0002,00091
因此,这意味着该节点ID 0001连接到节点95784和98743等。 我需要在numpy中将它读入稀疏矩阵。我怎样才能做到这一点? 我是python的新手,所以这些教程也会有帮助。
我有一个大的csv文件,其中列出了图中节点之间的连接。例如:csv稀疏矩阵python
0001,95784
0001,98743
0002,00082
0002,00091
因此,这意味着该节点ID 0001连接到节点95784和98743等。 我需要在numpy中将它读入稀疏矩阵。我怎样才能做到这一点? 我是python的新手,所以这些教程也会有帮助。
使用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] []]
正是我需要的。任何可以推荐的优秀的scipy资源? – 2009-12-21 09:54:20
我想http://docs.scipy.org/doc/将是一个起点.. – miku 2009-12-21 09:56:26
一个小问题。 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
如果你想要一个邻接矩阵,你可以这样做:
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
您可能也有兴趣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)]
你说的 '0001连接到95784',在你想拥有矩阵的条件是什么意思? – kender 2009-12-21 08:44:32
通过这个我的意思是节点(id:0001)有一个定向链接到节点(ID:95784) – 2009-12-21 09:57:34