##############获取一个数组中每行第k大的值##################
k = 5
#topk_indices ,k个最大值的index
topk_indices = np.argpartition(x, -k, axis=1)[:, -k:] #返回排序完成数组的索引号;-k负数表示数组x中第k大的元素位于排序完成数组b的倒数第k个位置上;前面的元素都不大于第k大的元素,后面的元素都不小于第k大的元素
rows, _ = np.indices((x.shape[0], k))
#axis = 1维度列中,每行第k大的值
kth_vals = x[rows, topk_indices].min(axis=1).reshape([-1, 1])
例如:
x = np.arange(42).reshape((6,7))
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]
[21 22 23 24 25 26 27]
[28 29 30 31 32 33 34]
[35 36 37 38 39 40 41]]
print(kth_vals)
[[ 2]
[ 9]
[16]
[23]
[30]
[37]]
##############获取数组中每行大约第k大的所有值的索引坐标数组##############
row, col = np.where(x> kth_vals)
edges = np.concatenate([row.reshape([-1, 1]), col.reshape([-1, 1])], -1)
#(24,2)#每行大于第k大的值有4个,一共有6行,则有6*4个值对应的位置索引对;其中 2是行号列号
print(edges )
[[0 3]
[0 4]
[0 5]
[0 6]
[1 3]
[1 4]
[1 5]
[1 6]
[2 3]
[2 4]
[2 5]
[2 6]
[3 3]
[3 4]
[3 5]
[3 6]
[4 3]
[4 4]
[4 5]
[4 6]
[5 3]
[5 4]
[5 5]
[5 6]]