使用Networkx或其他Python框架自动计算图形中节点之间的距离

使用Networkx或其他Python框架自动计算图形中节点之间的距离,python,graph,networkx,graph-theory,Python,Graph,Networkx,Graph Theory,假设我们有一个由networkx库创建的节点为a、B、C的完整图G 每个节点都有一个类似{x:2,y:4}的坐标属性。当前,边权重为1,但它们应该是节点之间的欧几里德距离。我可以用for循环计算它们,但效率非常低 因此,我的问题是如何以有效的方式计算边权重 注意:我发现了,但这是一个老问题 编辑:我创建了我的网络,如下所示: # Get a complete graph rag = nx.complete_graph(L) if L > 0: for i, node in enu

假设我们有一个由networkx库创建的节点为a、B、C的完整图G

每个节点都有一个类似{x:2,y:4}的坐标属性。当前,边权重为1,但它们应该是节点之间的欧几里德距离。我可以用for循环计算它们,但效率非常低

因此,我的问题是如何以有效的方式计算边权重

注意:我发现了,但这是一个老问题

编辑:我创建了我的网络,如下所示:

# Get a complete graph
rag = nx.complete_graph(L)

if L > 0:
    for i, node in enumerate(nodes):

        x, y = get_coord() # This function cant be changed

        rag.nodes[i]["x"] = x
        rag.nodes[i]["y"] = y

如果您事先有数据,我们可以使用
numpy
和/或
pandas
首先批量计算距离,然后将数据加载到图形中

例如,我们可以首先构造一个n×2矩阵,其中:

import numpy as np

A = np.array([list(get_coord()) for _ in range(L)])
然后,我们可以使用
scipy
计算二维距离矩阵,例如:

from scipy.spatial.distance import pdist, squareform

B = squareform(pdist(A))
例如,如果
A
是:

>>> A
array([[ 0.16401235, -0.60536247],
       [ 0.19705099,  1.74907373],
       [ 1.13078545,  2.03750256],
       [ 0.52009543,  0.25292921],
       [-0.8018697 , -1.45384157],
       [-1.37731085,  0.20679761],
       [-1.52384856,  0.14468123],
       [-0.12788698,  0.22348265],
       [-0.27158565,  0.21804304],
       [-0.03256846, -2.85381269]])
然后
B
将是:

>>> B
array([[ 0.        ,  2.354668  ,  2.81414033,  0.92922536,  1.28563016,
         1.74220584,  1.84700839,  0.8787431 ,  0.93152683,  2.25702734],
       [ 2.354668  ,  0.        ,  0.97726722,  1.53062279,  3.35507213,
         2.20391262,  2.35277933,  1.5598118 ,  1.60114811,  4.60861026],
       [ 2.81414033,  0.97726722,  0.        ,  1.88617187,  3.99056885,
         3.10516145,  3.26034573,  2.20792312,  2.29718907,  5.02775867],
       [ 0.92922536,  1.53062279,  1.88617187,  0.        ,  2.15885579,
         1.897967  ,  2.04680841,  0.64865114,  0.79244935,  3.15551623],
       [ 1.28563016,  3.35507213,  3.99056885,  2.15885579,  0.        ,
         1.75751388,  1.7540036 ,  1.80766956,  1.75396674,  1.59741777],
       [ 1.74220584,  2.20391262,  3.10516145,  1.897967  ,  1.75751388,
         0.        ,  0.1591595 ,  1.24953527,  1.10578239,  3.34300278],
       [ 1.84700839,  2.35277933,  3.26034573,  2.04680841,  1.7540036 ,
         0.1591595 ,  0.        ,  1.39818396,  1.25440996,  3.34886281],
       [ 0.8787431 ,  1.5598118 ,  2.20792312,  0.64865114,  1.80766956,
         1.24953527,  1.39818396,  0.        ,  0.14380159,  3.07877122],
       [ 0.93152683,  1.60114811,  2.29718907,  0.79244935,  1.75396674,
         1.10578239,  1.25440996,  0.14380159,  0.        ,  3.08114051],
       [ 2.25702734,  4.60861026,  5.02775867,  3.15551623,  1.59741777,
         3.34300278,  3.34886281,  3.07877122,  3.08114051,  0.        ]])
现在我们可以基于该矩阵构造一个图:

G = nx.from_numpy_matrix(B)
现在我们看到权重匹配:

>>> G.get_edge_data(2,5)
{'weight': 3.105161451820312}

你能展示一下你是如何构建网络的吗。我想如果你在构建网络之前有数据,我们可以用pandas或numpy来加速。问题中添加了代码。正是我想要的!