考虑下面的代码:

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

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


当前回答

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

import numpy as np

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

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

其他回答

用你的例子:

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])

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

考虑相等元素的顺序

如果你运行一个排序程序并且两个元素相等,那么顺序通常不会改变。然而,flip/[::-1]方法改变了相等元素的顺序。

>>> arr = np.array([3, 5, 4, 7, 3])
>>> 
>>> np.argsort(arr)[::-1]
array([3, 1, 2, 4, 0])  # equal elements reorderd
>>> np.argsort(-arr)
array([3, 1, 2, 0, 4])  # equal elements not reorderd (compatible to other sorting)

出于兼容性原因,我更喜欢使用负数组的argsort方法。当arr表示更复杂元素的数字表示时,这一点尤其重要。

例子:

obj = ['street', 'house', 'bridge', 'station', 'rails']
arr = np.array([3, 5, 4, 7, 3])  # cost of obj in coins

免责声明:一个更常见的方法是解决上面的例子排序(list_of_tuples_obj_cost, key=lambda x: x[1])

可以使用翻转命令numpy.flipud()或numpy.fliplr()在使用argsort命令排序后按降序获取索引。那是我通常做的事。

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

import numpy as np

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

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