我使用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)
答案 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)