Python,使用argsort的关系问题

时间:2017-03-10 11:06:08

标签: python arrays sorting numpy

使用函数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 ,排序数组中的第一个点/索引应该是 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行的第一个条目(从零开始计数)不是 4 ({{1}我希望如此。我希望第4行为D[4,4]=0。第一个条目是 2 ,因为点 2 4 重叠,以便[4, 2, 1, 0, 3]和相同值条目{{1 }和D[2,4]=D[4,2]D[2,4]=0始终选择第一个。

有没有办法解决这个问题,以便D[4,2]=0的排序数组argsort始终以对应条目N[i,j]对应的索引开始?

感谢您的帮助, MarcoC

2 个答案:

答案 0 :(得分:2)

一种方法是用比全局最小值小的东西填充对角线元素,然后使用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]])

如果您不想更改输入数组,请复制然后进行对角线填充。

答案 1 :(得分:0)

这个怎么样:

import numpy as np

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. ]])

s = np.argsort(D)
line = np.argwhere(s[:,0] != np.arange(D.shape[0]))[0,0]
column = np.argwhere(s[line,:] == line)[0,0]
s[line,0], s[line, column] = s[line, column], s[line,0]

使用numpy.argwhere找到前面没有dioganal元素的行,然后交换列然后交换元素。然后s包含您最终想要的内容。

这适用于您的示例。在一般情况下,numpy.argwhere可以包含多个元素,必须在这些元素上运行循环,而不是在上面两行代码的末尾键入[0,0]

希望我能提供帮助。