2009-12-21 23 views
7

Tengo un gran archivo csv que enumera las conexiones entre los nodos en un gráfico. ejemplo:csv a matriz dispersa en python

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

Así que esto significa que el ID de nodo 0001 está conectado al nodo 95 784 y 98 743 y así sucesivamente. Necesito leer esto en una matriz dispersa en numpy. ¿Cómo puedo hacer esto? Soy nuevo en Python, así que los tutoriales sobre esto también podrían ser útiles.

+0

¿Qué quiere decir por '0001 está conectada a 95784', en los términos de la matriz que desea tener? – kender

+0

Con esto quiero decir que el nodo (id: 0001) tiene un enlace dirigido al nodo (id: 95784) –

Respuesta

10

Ejemplo utilizando lil_matrix (lista de matriz lista) de scipy.

Matriz de listas vinculadas por filas.

Esto contiene una lista (self.rows) de filas, cada una de las cuales es una lista ordenada de índices de columna de elementos distintos de cero. También contiene una lista (self.data) de listas de estos elementos.

$ 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 

Código:

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

Salida:

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

Exactamente lo que necesitaba. ¿Algún buen recurso para scipy que puedas recomendar? –

+0

Supongo que http://docs.scipy.org/doc/ sería un punto de partida. – miku

+0

Una pequeña pregunta. Los números en el csv no son los índices. es decir, que son identificadores del archivo comienza con 0001001,9304045 0001001,9308122 0001001,9309097 0001001,9311042 0001001,9401139 0001001,9404151 0001001,9407087 0001001,9408099 0001001,9501030 0001001,9503124 Entonces, ¿cómo convierto estos identificadores a índices numéricos, el servidor de identificación con el único propósito de identificar nodos, pueden ser reemplazados por índices equivalentes si son únicos? ¿Cómo puedo lograr esto? Sé que puedo crear filas y columnas tan grandes como la ID más grande, pero eso parece un desperdicio ya que los nodos como los índices 0 - 1001 se desperdician. –

1

Si desea una matriz de adyacencia, se puede hacer algo como:

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

Usted también puede estar interesado en Networkx, a/gráficos paquete de red pura pitón.

Desde el sitio web:

NetworkX es un paquete de Python para la creación, manipulación, y el estudio de la estructura, la dinámica y las funciones de las redes complejas.

>>> 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)] 
Cuestiones relacionadas