使用Networkx或其他Python框架

时间:2018-01-11 09:25:52

标签: python graph networkx graph-theory

假设我们有一个完整的图G,其中包含由networkx库创建的节点A,B,C。

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

所以我的问题是如何以有效的方式计算边权重?

注意:我找到this,但这是一个老问题。

编辑:我按如下方式创建了我的网络:

# 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

1 个答案:

答案 0 :(得分:1)

如果您预先获得了数据,我们可以使用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}