In IGRAPH können Sie igraph.Graph.Adjacency
verwenden, um eine Grafik aus einer Adjazenzmatrix zu erstellen, ohne zip
zu verwenden. Es gibt einige Dinge, die beachtet werden müssen, wenn eine gewichtete Adjazenzmatrix verwendet und in einem np.array
oder pd.DataFrame
gespeichert wird.
igraph.Graph.Adjacency
kann ein np.array
als Argument nicht nehmen, aber das leicht gelöst mit tolist
.
Ganzzahlen in der Adjazenzmatrix werden als Anzahl der Kanten zwischen den Knoten und nicht als Gewichte interpretiert, die durch Verwendung von Adjazenz als Booleschen Wert gelöst werden.
Ein Beispiel, wie es zu tun:
import igraph
import pandas as pd
node_names = ['A', 'B', 'C']
a = pd.DataFrame([[1,2,3],[3,1,1],[4,0,2]], index=node_names, columns=node_names)
# Get the values as np.array, it's more convenenient.
A = a.values
# Create graph, A.astype(bool).tolist() or (A/A).tolist() can also be used.
g = igraph.Graph.Adjacency((A > 0).tolist())
# Add edge weights and node labels.
g.es['weight'] = A[A.nonzero()]
g.vs['label'] = node_names # or a.index/a.columns
Sie können Ihre adjacency Datenrahmen rekonstruieren mit get_adjacency
von:
df_from_g = pd.DataFrame(g.get_adjacency(attribute='weight').data,
columns=g.vs['label'], index=g.vs['label'])
(df_from_g == a).all().all() # --> True
Streng genommen [Adjazenzmatrizen] (http: // en.wikipedia.org/wiki/Adjacency_matrix) sind boolesch. Was bedeuten die Werte in 'a_numpy' eigentlich? Sind sie Verbindungsgewichte? –
@ali_m Ich meinte damit Kantengewichte. – LondonRob