我正在尝试从矩阵行中为矩阵中的所有行检索第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数组。
这里一定有一些简单的解决方案,我看不到。
答案 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])