Numpy对每一行分类并检索KTH元素



我试图从矩阵中所有行的矩阵行中检索kth最大(或最小)元素。所以例如如果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会产生价值等级,但是我无法将我所看到的解决方案调整为2D数组。
这里必须有一些简单的解决方案,我看不到。

最胖的方法将使用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])

您可以对行排序,然后选择(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]

最佳

最新更新