使用功能argsort对2D数组排序时,我遇到以下问题。

更准确地说,假设我有5个点并计算了它们之间的欧几里得距离,这些距离存储在2D数组D中:

D=np.array([[0,0.3,0.4,0.2,0.5],[0.3,0,0.2,0.6,0.1],
           [0.4,0.2,0,0.5,0],[0.2,0.6,0.5,0,0.7],[0.5,0.1,0,0.7,0]])
D
array([[ 0. ,  0.3,  0.4,  0.2,  0.5],
       [ 0.3,  0. ,  0.2,  0.6,  0.1],
       [ 0.4,  0.2,  0. ,  0.5,  0. ],
       [ 0.2,  0.6,  0.5,  0. ,  0.7],
       [ 0.5,  0.1,  0. ,  0.7,  0. ]])


每个元素D[i,j](i,j = 0,...,4)表示点i与点j之间的距离。对角项当然等于零,因为它们显示了点到自身的距离。但是,可以有2个或更多的点重叠。例如,在这种特定情况下,点4位于点2的相同位置,因此距离D[2,4]D[4,2]等于零。

现在,我想对这个数组D进行排序:对于每个点,我都想知道其相邻点的索引,从最近到最远。当然,对于给定的点i,排序数组中的第一个点/索引应为i,即,与点1最接近的点是1。我使用了函数argsort

N = np.argsort(D)
N
array([[0, 3, 1, 2, 4],
       [1, 4, 2, 0, 3],
       [2, 4, 1, 0, 3],
       [3, 0, 2, 1, 4],
       [2, 4, 1, 0, 3]])


此函数正确地对距离进行排序,直到到达点4:我想要的第四行的第一项(从零开始计数)不是4(D[4,4]=0)。我希望第四行是[4, 2, 1, 0, 3]。第一个条目是2,因为点2和4重叠,所以D[2,4]=D[4,2],并且在相同值的条目D[2,4]=0D[4,2]=0之间,argsort始终选择第一个条目。

有没有一种方法可以解决此问题,以使N[i,j]的排序数组D[i,j]始终以与对角线条目D[i,i]=0对应的索引开头?

谢谢您的帮助,
马可

最佳答案

一种方法是用小于全局最小值的对角元素填充,然后使用argsort-

In [286]: np.fill_diagonal(D,D.min()-1) # Or use -1 for filling
           # if we know beforehand that the global minimum is 0

In [287]: np.argsort(D)
Out[287]:
array([[0, 3, 1, 2, 4],
       [1, 4, 2, 0, 3],
       [2, 4, 1, 0, 3],
       [3, 0, 2, 1, 4],
       [4, 2, 1, 0, 3]])


如果您不希望更改输入数组,请复制并进行对角线填充。

关于python - Python,使用argsort的关系问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42716877/

10-11 15:24