numpy对每一行进行排序并检索第k个元素

时间:2019-03-04 13:59:49

标签: python numpy sorting

我正在尝试从矩阵行中为矩阵中的所有行检索第k个最大(或最小)的元素。所以例如如果k = 3,那么我想要所有行中的第三大元素。在从所有行中获取元素之后,我要对该向量进行排序。

这是我到目前为止得到的:

dist = np.array([[0.        , 2.7349432 , 3.57365027, 0.33696172, 1.40063669],
       [2.7349432 , 0.        , 0.8692355 , 2.9937996 , 1.47642103],
       [3.57365027, 0.8692355 , 0.        , 3.81469329, 2.27521406],
       [0.33696172, 2.9937996 , 3.81469329, 0.        , 1.62590145],
       [1.40063669, 1.47642103, 2.27521406, 1.62590145, 0.        ]])

neighbor_distance_argsort = np.argsort(dist, axis=1)
k_neighbor_dist = np.sort(dist[neighbor_distance_argsort == k - 1])

我得到的顺序是错误的,并且选择了错误的元素。 我知道argsort并不是我想要的(或认为会的)。而且我读过某个地方,双argsort会产生值排名,但我无法将seen的解决方案改编为2D数组。
这里一定有一些简单的解决方案,我看不到。

2 个答案:

答案 0 :(得分:2)

您可以对行进行排序,然后选择(k-1)th列。

k = 3
dist = np.array([[0.        , 2.7349432 , 3.57365027, 0.33696172, 1.40063669], 
                 [2.7349432 , 0.        , 0.8692355 , 2.9937996 , 1.47642103], 
                 [3.57365027, 0.8692355 , 0.        , 3.81469329, 2.27521406],
                 [0.33696172, 2.9937996 , 3.81469329, 0.        , 1.62590145],
                 [1.40063669, 1.47642103, 2.27521406, 1.62590145, 0.        ]])

sortedDist =  np.sort(dist)
print sortedDist [:, k-1]

最佳

答案 1 :(得分:2)

最有趣的方法是使用np.partition,因为实际上不需要对整个数组进行排序。

def kth(dist, k):
    return np.sort(np.partition(dist, k-1, axis = 1)[:, k-1])

kth(dist, 3)
Out[]: array([ 1.40063669,  1.47642103,  1.47642103,  1.62590145,  2.27521406])