2017-10-16 244 views
0

我使用Python Networkx建立的曲线图和我有以下的节点位置作为一个例子(positions.txt):Python Scipy和Networkx:如何计算欧几里德距离矩阵?

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

节点ID,X,Y予读取使用熊猫文件并将位置设置为Networkx中的节点属性。在for循环中使用add_edge(id1, id2, weight)方法添加节点(没有自身边缘)。到目前为止,我已经假设所有的节点默认都是相互连接的,并且没有考虑节点的半径或距离等参数。
现在,我想计算使用这些节点位置的节点之间的欧几里德半径或距离矩阵,并且使用此矩阵,我希望能够打印落在给定半径范围内的节点的邻居,并将该文件另存为一个csv矩阵文件。一位朋友建议我使用scipyeuclidean方法,但我不知道如何使用它来构建矩阵,因此我没有起点。我尝试使用ego_graph(),但它没有给我想要的结果。
任何帮助在解决我的问题表示赞赏。
在此先感谢。 (使用Ubuntu 14.04 32位虚拟机和Python 2.7)

+0

节点对(i,j)的距离与(j,i)的距离相同,并且显然如果一个在范围内,那么将是另一个。当你保存你的数据时,你想要两个结果吗? – Reti43

+0

@ Reti43这是你所做的一个好点子。如果两个结果都保存了,那么它肯定会成为矩阵。我假设如果我只保存一个结果,那么它就像一个边界列表。如果我能够同时拥有这两种产品,那么最好能让我选择哪种产品最适合我的实验。 – user136819

+0

还有一个问题,即使它可能不相关。 add_edge(id1,id2,weight)'添加节点的含义是什么?你可以用'add_node()'简单地添加一个节点,然后将该位置设置为一个属性,就像你之前描述的一个句子一样。 – Reti43

回答

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) 
+0

另外,出于好奇(还有一点必要性),我还有另一个问题:我正在循环运行'nx.draw'和'plt.show()'以重新创建图形中边缘的添加和删除(如电影)。但是这些循环会导致输出与先前迭代中的所有边和节点重叠,并污染不需要的输出。您是否知道在每次迭代中“重绘”图形的方法/方法,以避免上述问题?再次感谢您的帮助:) – user136819

+0

@MFHS有各种动画显示方法,最简单的方法是在每个循环中调用'plt.cla()'以清除当前坐标轴。 (你可能还需要调用'plt.gcf()。canvas.draw()')。如果你只是需要检查一个短序列,但是随着更多的重绘会变得越来越迟缓,这通常是可以的。如需更多选择,请参阅[动画API](https://matplotlib.org/api/animation_api.html) – Bonlenfum