考虑下面的代码:

avgDists = np.array([1, 8, 6, 9, 4])
ids = avgDists.argsort()[:n]

这给出了n个最小元素的下标。是否可以使用相同的argsort按降序得到n个最高元素的下标?


当前回答

另一种方法是在argsort的参数中只使用一个'-',例如:"df[np。Argsort (-df[:, 0])]",如果df是数据帧,你想要按第一列排序(由列号'0'表示)。适当地更改列名。当然,列必须是数字。

其他回答

用你的例子:

avgDists = np.array([1, 8, 6, 9, 4])

获取n个最大值的索引:

ids = np.argpartition(avgDists, -n)[-n:]

按降序排序:

ids = ids[np.argsort(avgDists[ids])[::-1]]

获得结果(n=4):

>>> avgDists[ids]
array([9, 8, 6, 4])

正如@Kanmani所暗示的,更容易解释的实现可能使用numpy。翻转,如下所示:

import numpy as np

avgDists = np.array([1, 8, 6, 9, 4])
ids = np.flip(np.argsort(avgDists))
print(ids)

通过使用访问者模式而不是成员函数,可以更容易地读取操作的顺序。

另一种方法是在argsort的参数中只使用一个'-',例如:"df[np。Argsort (-df[:, 0])]",如果df是数据帧,你想要按第一列排序(由列号'0'表示)。适当地更改列名。当然,列必须是数字。

一种优雅的方式可以如下-

ids = np.flip(np.argsort(avgDists))

这将给出按降序排序的元素索引。 现在你可以使用常规切片…

top_n = ids[:n]

而不是用np。Argsort你可以用np。Argpartition -如果你只需要最低/最高n个元素的索引。

这并不需要对整个数组进行排序,只需要对你需要的部分进行排序,但请注意“分区内的顺序”是未定义的,所以虽然它给出了正确的索引,但它们的顺序可能并不正确:

>>> avgDists = [1, 8, 6, 9, 4]
>>> np.array(avgDists).argpartition(2)[:2]  # indices of lowest 2 items
array([0, 4], dtype=int64)

>>> np.array(avgDists).argpartition(-2)[-2:]  # indices of highest 2 items
array([1, 3], dtype=int64)