2009-12-21 192 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)]