Leyendo un gráfico networkx de un archivo csv con encabezado de fila y columna

Tengo un archivo CSV que representa la matriz de adyacencia de un gráfico. Sin embargo, el archivo tiene como primera fila las tags de los nodos y como primera columna también las tags de los nodos. ¿Cómo puedo leer este archivo en un objeto gráfico networkx ? ¿Hay una forma de python ordenada de hacerlo sin piratear?

Mi juicio hasta ahora:

 x = np.loadtxt('file.mtx', delimiter='\t', dtype=np.str) row_headers = x[0,:] col_headers = x[:,0] A = x[1:, 1:] A = np.array(A, dtype='int') 

Pero, por supuesto, esto no resuelve el problema ya que necesito las tags para los nodos en la creación del gráfico.

Ejemplo de los datos:

 Attribute,A,B,C A,0,1,1 B,1,0,0 C,1,0,0 

Una pestaña es el delimitador, no una coma aunque.

Podrías leer los datos en una matriz estructurada. Las tags se pueden obtener de x.dtype.names , y luego se puede generar el gráfico nx.from_numpy_matrix usando nx.from_numpy_matrix :

 import numpy as np import networkx as nx import matplotlib.pyplot as plt # read the first line to determine the number of columns with open('file.mtx', 'rb') as f: ncols = len(next(f).split('\t')) x = np.genfromtxt('file.mtx', delimiter='\t', dtype=None, names=True, usecols=range(1,ncols) # skip the first column ) labels = x.dtype.names # y is a view of x, so it will not require much additional memory y = x.view(dtype=('int', len(x.dtype))) G = nx.from_numpy_matrix(y) G = nx.relabel_nodes(G, dict(zip(range(ncols-1), labels))) print(G.edges(data=True)) # [('A', 'C', {'weight': 1}), ('A', 'B', {'weight': 1})] 

La nx.from_numpy_matrix tiene un parámetro create_using que puede usar para especificar el tipo de gráfico de redx que desea crear. Por ejemplo,

 G = nx.from_numpy_matrix(y, create_using=nx.DiGraph()) 

hace G a DiGraph .

Esto funcionaría, no estoy seguro de que sea la mejor manera:

 In [23]: import pandas as pd import io import networkx as nx temp = """Attribute,A,B,C A,0,1,1 B,1,0,0 C,1,0,0""" # for your case just load the csv like you would do, use sep='\t' df = pd.read_csv(io.StringIO(temp)) df Out[23]: Attribute ABC 0 A 0 1 1 1 B 1 0 0 2 C 1 0 0 In [39]: G = nx.DiGraph() for col in df: for x in list(df.loc[df[col] == 1,'Attribute']): G.add_edge(col,x) G.edges() Out[39]: [('C', 'A'), ('B', 'A'), ('A', 'C'), ('A', 'B')] In [40]: nx.draw(G) 

introduzca la descripción de la imagen aquí