Python:如何对二维数组进行降序argsort?

5
我需要按照第一列降序排序数组,具体来说我的代码是:

>>> x = np.array([[2, 3], [1998,5], [1998,7]])
>>> x = x[np.argsort(x[:,0])]

但是输出结果为:
array([[   2,    3],
       [1998,    5],
       [1998,    7]])

但我需要按降序排列。有人能解释一下如何做吗?

编辑:@Babyburger建议使用以下解决方案:

x = x[np.argsort(x[:,0])][::-1]

提供的

array([[1998,    7],
       [1998,    5],
       [   2,    3]])

这可能是可以的,但我希望在第一列上的值相同的情况下,顺序不会改变。因此输出结果应该是:

array([[1998,    5],
       [1998,    7],
       [   2,    3]])

有没有简单的方法来做到这一点?

尝试使用 x = x[np.argsort(x[:,0])[::-1]] - Babyburger
谢谢您的回答。我已经编辑了主贴。 - Daniele Sartori
1个回答

3

在这个特定的需求中,您可以使用Python的sorted函数,它是稳定的

a =  np.array([[2, 3], [1998,5], [1998,7]])
res = np.array(sorted(a, key= lambda x: -x[0]))

它的作用是:使用每行的第一个元素进行比较(通过lambda访问器),并将其否定以实现降序。由于稳定性,如果第一个元素相同,则行将保留顺序。

输出:

[[1998    5]
 [1998    7]
 [   2    3]]

编辑:如果您希望每当前面的列相同时(具有相同的排序)按照以下列进行排序:

a =  np.array([[2, 3], [1998,5], [1998,7]])
res = np.array(sorted(a, key=lambda x:(-x).tolist()))

这将把行转换为列表,然后使用序列比较。请注意,在此示例中,它将按递减顺序排序(因此为(-x))。


1
我喜欢你提到Python的sorted是稳定的!为了向其他人澄清,当使用默认参数(kind="quicksort")时,np.argsort并非如此,但是当使用kind="mergesort"时则是这样。 - Martin Hallén

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接