Verwenden Sie networkx, eine Bibliothek, die Diagramme in Python verarbeitet (Teil 2: Lernprogramm).

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.

Was ging

  1. Zusammenfassung des Tutorials auf der offiziellen Website von networkx.

Umgebung

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

Diagrammelement

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

Fügen Sie Knoten und Kanten hinzu

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')])

Löschen Sie Knoten und Kanten

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

Grafik anzeigen

python


>>> import matplotlib.pyplot as plt
>>> nx.draw(G, with_labels=True)             #Etikette
>>> plt.show()

Automatische Grafikerstellung

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

Informationsextraktion von Graphelementen

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})

Figure_1.png

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.

Zugriff auf Diagrammelementattribute

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.) draw_graph.png

Diagrammtyp

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.

Grafikbetrieb

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.

Teilgraph

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)

subgraph.png

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

graph_process_org.png graph_union.png

Direkte Produktgrafik

Der direkte Produktgraph, der aus dem obigen Ga und Gb besteht, ist wie folgt.

python


>>> H = nx.cartesian_product(Ga, Gb)

cartesian_product.png

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)

compose.png

Kompliment

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)

complement.png

Konvertierung zwischen gerichteten und ungerichteten Graphen

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)

directed_undirected.png

Grafik speichern

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")

In Verbindung stehender Artikel

Recommended Posts

Verwenden Sie networkx, eine Bibliothek, die Diagramme in Python verarbeitet (Teil 2: Lernprogramm).
Erstellt eine Python-Bibliothek DateTimeRange, die Zeitbereiche verarbeitet
Veröffentlichung einer Bibliothek, die Zeichendaten in Python-Bildern verbirgt
Verwenden Sie Pymol als Python-Bibliothek
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Ein Memo, das doppelte Anführungszeichen in voller Breite mit regulären Python-Ausdrücken verarbeitet
Über psd-tools, eine Bibliothek, die psd-Dateien in Python verarbeiten kann
Mit Python Teil 2 ein Herz zeichnen (SymPy Edition)
Einführung einer Bibliothek, die unter Python / Windows nicht in pip enthalten war
Verwendung von hmmlearn, einer Python-Bibliothek, die versteckte Markov-Modelle realisiert
Code lesen von faker, einer Bibliothek, die Testdaten in Python generiert
Verwendung der C-Bibliothek in Python
Ein Memo, das ich schnell in Python geschrieben habe
Verwendung der Python-Bildbibliothek in der Python3-Serie
Ein Programm, das doppelte Anweisungen in Python entfernt
Verwenden Sie eine benutzerdefinierte Fehlerseite mit Python / Tornado
Verwenden Sie die LibreOffice-App in Python (3) Bibliothek hinzufügen
Ich habe PyQCheck, eine Bibliothek, die QuickCheck mit Python ausführen kann, in PyPI registriert.
Verwenden Sie config.ini mit Python
Verwenden Sie Datumsangaben in Python
Eine persönlich verwendete Vorlage zum Erstellen von Discord BOT in Python (Notizen)
So verwenden Sie eine Bibliothek, die ursprünglich nicht in Google App Engine enthalten war
Verwenden Sie Valgrind mit Python
Ein Hinweis zur Bibliotheksimplementierung, in der Hyperparameter mithilfe der Bayes'schen Optimierung in Python untersucht werden
Verwenden Sie Cursur, das in Python automatisch mit sqlite3 geschlossen wird
Suchen Sie den Teil 575 aus Wikipedia in Python
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator
Verwenden Sie communic (), wenn Sie eine Ausgabe in einem Python-Unterprozess empfangen
[Python] Eine praktische Bibliothek, die Kanji in Hiragana konvertiert
Verwenden Sie den Profiler in Python
Veröffentlichen / Hochladen einer in Python erstellten Bibliothek in PyPI
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
Python-Programm von "Buch, das schwieriges Programmieren leicht lehrt"
Ein Allzweckprogramm, das Linux-Befehlszeichenfolgen mit Python formatiert
Eine Funktion, die iterable in Python in N Teile unterteilt
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
Durchlaufen Sie einen Generator, der einen Datumsiterator in Python zurückgibt
Verwendung der Methode __call__ in der Python-Klasse
Das japanische Zeichen verstümmelte die Eliminierung von Matplotlib und NetworkX der Python-Bibliothek
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Verwenden Sie ein Makro, das beim Speichern von Python mit vscode ausgeführt wird
Entwickelte eine Bibliothek, um die Kindle-Sammlungsliste in Python abzurufen
Ich habe versucht, "ein Programm, das doppelte Anweisungen in Python entfernt"
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
[MQTT / Python] Implementierte eine Klasse, die Pub / Sub von MQTT in Python ausführt
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Ein Memorandum, das Sie häufig mit Selen in Python verwenden
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Mal sehen, wie def in Python verwendet wird
Machen Sie einen Screenshot in Python
Verwenden Sie Richtungsdiagramme mit networkx
Verwenden Sie den let-Ausdruck in Python
Verwenden Sie das Messprotokoll mit Python
Erstellen Sie ein Wörterbuch in Python
Verwenden Sie die Rückruffunktion in Python
[Python] Verwenden Sie eine Zeichenfolgenfolge
Verwenden Sie den HTTP-Cache in Python
Verwenden Sie in Python ein Diktat mit Listenschlüssel