Eric Ma's Kurse zur Netzwerkanalyse unter Datacamp (Einführung in die Netzwerkanalyse in Python -network-analysis-in-python)) war sehr gut, daher werde ich anhand des Inhalts des Kurses zusammenfassen, was ich über networkx gelernt habe.
Die zuletzt erstellte Docker-Umgebung wurde wie folgt geändert.
host
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
Dockerfile
FROM nvcr.io/nvidia/tensorflow:19.12-tf1-py3
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y python3-tk && \
pip install --upgrade pip && \
pip install networkx && \
pip install nxviz && \
pip install pytest && \
pip install nose
Ein Graph wird durch eine Sammlung von Knoten (Knoten oder Eckpunkte) und ein Knotenpaar definiert, die als Kanten (Kanten oder Verknüpfungen usw.) bezeichnet werden. Hier besteht ein Knoten aus hashbaren Objekten (Text, Bilder, in XML definierte Objekte, andere Diagramme usw.). In Bezug auf das Konzept von Hashable war Erläuterung dieses Artikels leicht zu verstehen.
python_shell
>>> import networkx as nx
>>> G = nx.Graph()
>>> G2 = nx.Graph([(0, 1), (1, 2), (2, 0)]) #Geben Sie Knoten und Kanten an
python
>>> G.add_node(1) #Fügen Sie einen Knoten hinzu
>>> G.add_node('one')
>>> G.add_nodes_from([2, 3]) #Fügen Sie mehrere Knoten hinzu
>>> G.add_nodes_from(['two', 'three'])
>>> G.add_edge(1, 2) #Kante hinzufügen
>>> G.add_edges_from([('one',1), (2, 3), (2, 4), (2, 'two'), (2, 'three'), ('two', 'three')])
python
>>> G.remove_node(1) #Die Verbindungskanten werden ebenfalls gelöscht
>>> G.remove_nodes_from(['one', 'Two']) #Löschen Sie mehrere Knoten
>>> G.remove_edge('one', 1) #Löschen Sie eine Kante
>>> G.remove_edges_from([(2, 3), (2, 4)]) #Entfernen Sie mehrere Kanten
>>> G.clear() #Entfernen Sie alle Elemente
python
>>> import matplotlib.pyplot as plt
>>> nx.draw(G, with_labels=True) #Etikette
>>> plt.show()
networkx kann automatisch verschiedene Arten von Diagrammen erstellen. Offizielle Website Es gibt eine detaillierte Erklärung, aber die Hauptgrafik ist dieser Blog //piroshhh.hatenablog.com/entry/2016/04/06/221852) war hilfreich. Schließlich ist es einfacher zu verstehen, wenn man sich die Struktur des Diagramms ansieht. Deshalb habe ich den Code graph_generator_classic.py erstellt, um das klassische Diagramm auf der obigen offiziellen Website zu erstellen. (Graph_generator_small.py für kleine Diagramme und graph_generator_random.py für zufällige Diagramme werden ebenfalls erstellt.) (Hinweis: Wenn Sie eine Umgebung mit der oben genannten Doker-Datei erstellen, lautet die Version von networkx 2.3. Networkx2.4 ist Sie benötigen bei Bedarf $ pip install --upgrade networkx. )
python
>>> H = nx.path_graph(7)
>>> J = nx.turan_graph(5, 2)
>>> K = nx.star_graph(5)
Hier in networkx können Sie Knoten und Kanten aus anderen Diagrammen extrahieren und einem anderen Knoten hinzufügen, oder Sie können das andere Diagramm selbst zu einem Knoten machen.
python
>>> G.add_nodes_from(H) #Fügen Sie nur die Knoten in Grafik H hinzu
>>> G.add_edges_from(H.edges) #Fügen Sie nur die Kanten des Diagramms H hinzu
>>> G.add_node(H) #Fügen Sie Graph H als einen Knoten von Graph G hinzu
>>> G.add_nodes_from([J, K])
Es gibt vier grundlegende Eigenschaften, die die Diagrammelemente beschreiben. Das folgende Raddiagramm mit 7 Knoten als Beispiel sieht wie folgt aus.
python
>>> G = nx.wheel_graph(7)
>>> nx.draw(G, with_labels=True)
>>> plt.show()
>>> G.nodes
NodeView((0, 1, 2, 3, 4, 5, 6))
>>> G.edges
EdgeView([(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (1, 2), (1, 6), (2, 3), (3, 4), (4, 5), (5, 6)])
>>> G.adj #Informationen zu benachbarten Knoten
AdjacencyView({0: {1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}}, 1: {0: {}, 2: {}, 6: {}}, 2: {0: {}, 1: {}, 3: {}}, 3: {0: {}, 2: {}, 4: {}}, 4: {0: {}, 3: {}, 5: {}}, 5: {0: {}, 4: {}, 6: {}}, 6: {0: {}, 5: {}, 1: {}}})
>>> G.degree #Anzahl benachbarter Knoten
DegreeView({0: 6, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3})
Da der Rückgabewert dem Wörterbuchtyp ähnlich ist, können Sie eine Schleife mit .items () ausführen oder innerhalb des Attributs mit .data ('word') suchen. Darüber hinaus kann es durch Zuweisung in Listen, Sets, Wörterbücher und Taples konvertiert werden.
Auf die Attribute der Knoten und Kanten des Diagramms kann per Abonnement zugegriffen werden.
python
>>> G.nodes[0] #Zugriff auf die Attribute von Knoten 0
{}
>>> G.edges[0,1] #Kante(0, 1)Zugriff auf Attribute von
{}
>>> G.adj[0] #Zugriff auf die Kante neben Knoten 0
AtlasView({1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}})
>>> G.degree[0] #Anzahl benachbarter Knoten von Knoten 0
6
Die Attribute von Diagrammelementen können mit der folgenden Beschreibung hinzugefügt werden.
python
>>> G.nodes[0]['color'] = 'blue'
>>> G.edges[0,1]['weight']=0.1
>>> G.nodes[0]
{'color': 'blue'}
>>> G.edges[0,1]
{'weight': 0.1}
>>> G.adj[0]
AtlasView({1: {'weight': 0.1}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}})
Die in G.adj [0] gezeigten Attribute sind Kantenattribute, keine Knotenattribute. Häufig verwendete Attribute wie Gewichte werden ebenfalls wie folgt geschrieben.
python
>>> G.add_weighted_edges_from([(0, 1, 0.1), (0, 2, 0.2), (0, 3, 0.3), (0, 4, 0.4), (0, 5, 0.5), (0, 6, 0.6)])
>>> G.adj[0]
AtlasView({1: {'weight': 0.1}, 2: {'weight': 0.2}, 3: {'weight': 0.3}, 4: {'weight': 0.4}, 5: {'weight': 0.5}, 6: {'weight': 0.6}})
Wenn Sie das Attribut löschen möchten, schreiben Sie wie folgt.
python
>>> del G.node[1]['color']
>>> del G.edges[0,1]['weight']
Das durch Angabe anderer Attribute gezeichnete Diagramm sieht folgendermaßen aus. Der Code finden Sie unter draw_graph.py. (Dieses offizielle Dokument und Dieser Artikel ) Wurde verwiesen.)
Zusätzlich zu den ungerichteten Graphen, mit denen wir uns bisher befasst haben, gibt es auch gerichtete Graphen mit Kanten und Mehrfachgraphen, die mehrere Kanten zwischen demselben Knotenpaar definieren können. In Bezug auf die Diagrammtypen war die Erklärung in diesem Artikel leicht zu verstehen.
python
>>> GG = nx.Graph() #Ungerichtete Grafik
>>> DG = nx.DiGraph() #Gerichteter Graph
>>> MG = nx.MultiGraph() #Mehrfacher ungerichteter Graph
>>> MG = nx.MultiDiGraph() #Mehrfach gerichteter Graph
Für gerichtete Diagramme können Sie nx.out_degree () und nx.in_degree () verwenden, um benachbarte Knoten getrennt nach der Richtung der Kanten zu zählen. In nx.degree () wird die Summe von beiden angegeben.
Die Verarbeitung zwischen Diagrammen für Diagramme ist ebenfalls definiert. In Bezug auf das Verarbeitungsergebnis habe ich auch auf [diesen Artikel] verwiesen (https://www.geeksforgeeks.org/operations-on-graph-and-special-graphs-using-networkx-module-python/). Ich habe auch den Code graph_operation.py geschrieben, um diese Grafiken zu zeichnen.
Ein Diagramm, das nur von einigen Knoten des Diagramms definiert wird, wird als Teildiagramm bezeichnet. Aus dem vollständigen Diagramm mit 5 Knoten links befindet sich beispielsweise das Teildiagramm, das aus dem Knotensatz [1,2,3,4] besteht, rechts. Von den im Originaldiagramm enthaltenen Kanten sind nur die Kanten zwischen dem ausgewählten Knotensatz im Teildiagramm enthalten.
python
>>> Ga = nx.complete_graph(5)
>>> nbunch = [1,2,3,4]
>>> H = nx.subgraph(Ga, nbunch)
Union or Disjoint-Union of Graph Ein Prozess namens union / disjoint-union, der die Summe der Graphen darstellt, wird definiert. Im Allgemeinen ist Vereinigung die Summe von Knoten und Kanten, aber networkx geht davon aus, dass die Graphen G1 und G2 nicht denselben Knoten enthalten (disjunkt). Wenn Sie die Vereinigung zweier Diagramme suchen möchten, die Knoten mit demselben Namen enthalten, verwenden Sie disjoint_union oder verwenden Sie das Umbenennungsattribut in union, um die in jedem Diagramm enthaltenen Knoten umzubenennen. Für das Konzept der disjunkten Vereinigung von Graphen war dieser Artikel Wikipedia hilfreich.
python
>>> Ga = nx.complete_graph(5)
>>> Gb = nx.ladder_graph(5)
>>> H = nx.union(Ga, Gb, rename=('a-','b-')) #Bei Verwendung von Union
>>> H = nx.disjoint_union(Ga, Gb) #disjoint_Bei Verwendung von Union
Der direkte Produktgraph, der aus dem obigen Ga und Gb besteht, ist wie folgt.
python
>>> H = nx.cartesian_product(Ga, Gb)
compose Der zusammengesetzte Graph, der aus dem obigen Ga und Gb besteht, ist wie folgt. Comoise ist ein Diagramm, in dem gleichnamige Knoten gemeinsam genutzt und konfiguriert werden.
python
>>> nx.compose(Ga, Gb)
Ein Diagramm, das aus Kanten besteht, die nicht zwischen den Knoten des ursprünglichen Diagramms definiert sind, wird als zusätzliches Diagramm bezeichnet. Im Kontaktplandiagramm auf der linken Seite befindet sich beispielsweise das ergänzende Diagramm auf der rechten Seite.
python
>>> nx.complement(Gb)
Es gibt auch den Prozess des Konvertierens gerichteter und ungerichteter Graphen. Wenn Sie nun ein ungerichtetes Diagramm in ein gerichtetes Diagramm konvertieren möchten, haben die Kanten beide Richtungen.
python
>>> H = nx.to_directed(Ga)
>>> H = nx.to_undirected(Ga)
Sie können das erstellte Diagramm in einer Datei speichern oder aus einer Datei laden.
python
>>> nx.write_gml(red, "test.gml")
>>> G = nx.read_gml("test.gml")