2009-12-21 22 views
7

Ho un grande file csv che elenca le connessioni tra i nodi in un grafico. Esempio:csv a matrice sparsa in python

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

Quindi questo significa che il nodo id 0001 è collegato al nodo 95.784 e 98743 e così via. Ho bisogno di leggere questo in una matrice sparsa in numpy. Come posso fare questo? Sono nuovo in Python quindi anche le esercitazioni su questo sarebbero utili.

+0

Che cosa si intende per '0001 è collegato a 95.784', nei termini della matrice che si desidera avere? – kender

+0

Con questo voglio dire che il nodo (id: 0001) ha un collegamento diretto al nodo (id: 95784) –

risposta

10

Esempio con lil_matrix (elenco di matrice lista) del SciPy.

Matrice di elenchi concatenati basata su righe.

Questo contiene un elenco (self.rows) di righe, ognuna delle quali è un elenco ordinato di indici di colonna di elementi diversi da zero. Contiene anche un elenco (self.data) di elenchi di questi elementi.

$ 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 

Codice:

#!/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 

uscita:

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

Esattamente ciò di cui avevo bisogno. Qualche buona risorsa per scipy che puoi raccomandare? –

+0

credo che http://docs.scipy.org/doc/ sarebbe un punto di partenza .. – miku

+0

Una piccola domanda. I numeri nel CSV non sono gli indici. sono Ids cioè il file inizia con 0001001,9304045 0001001,9308122 0001001,9309097 0001001,9311042 0001001,9401139 0001001,9404151 0001001,9407087 0001001,9408099 0001001,9501030 0001001,9503124 Quindi, come faccio a convertire questi ID in indici numerici, il server ID ha lo scopo di identificare solo i nodi, essi possono essere sostituiti da indici equivalenti se sono unici. Come posso realizzare questo. So che posso semplicemente creare righe e colonne grandi quanto l'ID più grande, ma ciò sembra inutile dato che i nodi come gli indici 0 - 1001 sono sprecati. –

1

Se si desidera una matrice di adiacenza, si può fare qualcosa di simile:

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

Potreste anche essere interessati a Networkx, un/pacchetto grafico di rete pura pitone.

Dal sito web:

NetworkX è un pacchetto di Python per la creazione, la manipolazione, e lo studio della struttura, dinamiche, e le funzioni delle reti complesse.

>>> 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)] 
Problemi correlati