Python Scipy和Networkx:如何计算欧几里德距离矩阵?

时间:2017-10-16 13:41:03

标签: python matrix scipy networkx

我使用Python Networkx 来构建图表,我将以下节点位置作为示例(positions.txt):

1 21.5 23
2 24.5 20
3 19.5 19
4 22.5 15
5 24.5 12  

节点ID,X,Y。我使用Pandas读取文件,并将位置设置为Networkx中的节点属性。在add_edge(id1, id2, weight)循环中使用for方法添加节点(没有自身边缘)。到目前为止,我假设所有节点默认都是相互连接的,并没有考虑Radius或节点距离等参数。
现在,我想使用这些节点位置计算节点之间的欧几里德半径或距离矩阵,并且使用此矩阵,我希望能够打印属于给定半径n的节点的邻居并保存将文件作为csv矩阵文件。一位朋友建议我使用scipy的{​​{1}}方法,但我不知道如何使用它来构建矩阵,因此我没有起点。我尝试使用euclidean,但它没有给我预期的结果 在解决我的问题时,我们对任何帮助表示赞赏 提前致谢。 (使用Ubuntu 14.04 32位VM和Python 2.7)

1 个答案:

答案 0 :(得分:2)

您可以使用scipy.spatial.distance.cdist()在给定坐标列表的情况下生成距离矩阵。

显然,numpy数组总是0索引,如果你的节点有随机数,你想保留它们的列表,以便知道矩阵的哪一行/哪一列对应哪一对。

之后你要做的事情应该是微不足道的,但我会根据你的描述给出一个例子。对于每个节点,打印所述节点的id和阈值距离内任何相邻节点的id。

import numpy as np
from scipy.spatial import distance

def neighbour_nodes_of(node, dist_matrix, distance):
    row = dist_matrix[node]
    return np.where((row <= distance) * (row > 0))[0]

ids = [1, 2, 3, 4, 5]
coords = [(21.5, 23),
          (24.5, 20),
          (19.5, 19),
          (22.5, 15),
          (24.5, 12),
          ]
threshold = 8.

dist_matrix = distance.cdist(coords, coords)

# this is something you can write to a file instead
for i, node_id in enumerate(ids):
    neighbours = neighbour_nodes_of(i, dist_matrix, threshold)
    neighbour_ids = [ids[n] for n in neighbours]
    print([node_id] + neighbour_ids)