NetworkX: Wie kann man eine Inzidenzmatrix eines gewichteten Graphen erstellen?

Nachdem ein Raster-Netzwerk wie folgt erstellt wurde:

from __future__ import division import networkx as nx from pylab import * import matplotlib.pyplot as plt %pylab inline ncols=10 N=10 #Nodes per side G=nx.grid_2d_graph(N,N) labels = dict( ((i,j), i + (N-1-j) * N ) for i, j in G.nodes() ) nx.relabel_nodes(G,labels,False) inds=labels.keys() vals=labels.values() inds=[(Nj-1,Ni-1) for i,j in inds] pos2=dict(zip(vals,inds)) 

Und jeder Kante ein Gewicht entsprechend seiner Länge zugeordnet hat (in diesem trivialen Fall alle Längen = 1):

 #Weights from math import sqrt weights = dict() for source, target in G.edges(): x1, y1 = pos2[source] x2, y2 = pos2[target] weights[(source, target)] = round((math.sqrt((x2-x1)**2 + (y2-y1)**2)),3) for e in G.edges(): G[e[0]][e[1]] = weights[e] #Assigning weights to G.edges() 

Dies ist, was mein G.edges() aussieht: (startnode ID, endnode ID, Gewicht)

 [(0, 1, 1.0), (0, 10, 1.0), (1, 11, 1.0), (1, 2, 1.0),... ] #Trivial case: all weights are unitary 

Wie kann ich eine Inzidenzmatrix erstellen, die die soeben definierten Gewichte berücksichtigt? Ich möchte nx.incidence_matrix(G, nodelist=None, edgelist=None, oriented=False, weight=None) , aber was ist der richtige Wert für das weight in diesem Fall?

Die Docs sagen, dass weight ein String ist, der "den Kanaldatenschlüssel darstellt, der verwendet wird, um jeden Wert in der Matrix bereitzustellen", aber was bedeutet es speziell? Ich habe auch keine relevanten Beispiele gefunden.

Irgendwelche Ideen?

One Solution collect form web for “NetworkX: Wie kann man eine Inzidenzmatrix eines gewichteten Graphen erstellen?”

Hier ist ein einfaches Beispiel, wie man richtig kante Attribute und wie man eine gewichtete Inzidenzmatrix zu generieren.

 import networkx as nx from math import sqrt G = nx.grid_2d_graph(3,3) for s, t in G.edges(): x1, y1 = s x2, y2 = t G[s][t]['weight']=sqrt((x2-x1)**2 + (y2-y1)**2)*42 print(nx.incidence_matrix(G,weight='weight').todense()) 

AUSGABE

 [[ 42. 42. 42. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 42. 42. 42. 0. 0. 0. 0. 0. 0.] [ 42. 0. 0. 0. 0. 0. 42. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 42. 42. 42. 0. 0.] [ 0. 42. 0. 42. 0. 0. 0. 0. 42. 0. 42. 0.] [ 0. 0. 0. 0. 0. 0. 0. 42. 0. 0. 0. 42.] [ 0. 0. 0. 0. 0. 42. 0. 0. 0. 42. 0. 0.] [ 0. 0. 0. 0. 0. 0. 42. 0. 0. 0. 42. 42.] [ 0. 0. 42. 0. 42. 0. 0. 0. 0. 0. 0. 0.]] 

Wenn Sie eine bestimmte Anordnung der Knoten und Kanten in der Matrix wünschen, verwenden Sie die nodelist = und edgelist = optionale Parameter zu networkx.indicence_matrix ().

  • Vergewissern Sie sich, dass Matrixzeile aus Textdatei genommen ist die gleiche Länge (python3)
  • Matrix Multiplikation in Python?
  • Mit sciPy, um eine Funktion zu integrieren, die eine Matrix oder ein Array zurückgibt
  • So erstellen Sie eine Inzidenzmatrix
  • Wie kann ich eine Spalte aus einer spärlichen Matrix effizient entfernen?
  • Effiziente Art der Logarithmusfunktion in einer spärlichen Matrix
  • Ist MATLAB schneller als Python?
  • Farbe einer binären Matrix matplotlib
  • Wert, der sich an mehreren Positionen in einer Liste der Liste ändert, wenn man versucht, an einer Stelle zu wechseln
  • Numpy: Multiplizieren einer Matrix mit einem 3D-Tensor - Vorschlag
  • Python oneline, um Matrix der gegebenen Ordnung zu schaffen
  • Python ist die beste Programmiersprache der Welt.