【问题标题】:Get list of connected nodes ordered by shortest distance获取按最短距离排序的连接节点列表
【发布时间】:2017-03-02 18:51:43
【问题描述】:

我有一个 numpy 二维数组,它表示图上节点之间的距离。对于单个节点,我想获取按最短距离排序的连接节点列表,我该怎么做?

# create some data
distances = np.array([[0., 1., 2., 3.], [1.,0.,5.,7.], [2.,5.,0.,4.], [3.,7.,4.,0.]]) 
# get just the node I care about, 1
closest_to_node = distances[:,1]
print (closest_to_node)
# outputs [ 1.  0.  5.  7.]

我想按距离订购closest_to_node,但我知道它与哪个节点相关的唯一方法是数组中的顺序。

我想要一个 [1,0,2,3] 甚至更好的列表,因为在这种情况下第 1 项(值 0)是没有意义的 [1,2,3]

【问题讨论】:

  • 那么,每个节点都表示为一列,对吧?
  • 示例中不应该忽略 1 吗?为什么忽略 0? 0 的距离应该被忽略,但它的索引是 1 ...
  • 我说的是第 1 项,值为 0 应该被忽略。就像你说的那样。
  • @Psidom 这个问题涉及图上的距离,这很可能是欧几里得距离,因此不是链接的 dup 所谈论的。所以,我要重新开放了。
  • @P-robot distances[:,1] 被选为节点,我们从中获取所有节点的距离(据我了解数据格式的所有距离列)。 np.argsort(distances[:,1]) 没有任何意义。

标签: python numpy


【解决方案1】:

IIUC 你可以做 -

((distances - closest_to_node[:,None])**2).sum(0).argsort()

或者,Scipy's cdist -

from scipy.spatial.distance import cdist

idx = cdist(distances, closest_to_node[None]).argsort(0).ravel()

给定样本的输出 -

In [147]: ((distances - closest_to_node[:,None])**2).sum(0).argsort()
Out[147]: array([1, 0, 2, 3])

In [148]: cdist(distances, closest_to_node[None]).argsort(0).ravel()
Out[148]: array([1, 0, 2, 3])

【讨论】: