如何使用numpy按降序排序?

15

我有一个像这样的numpy数组:

A = array([[1, 3, 2, 7],
           [2, 4, 1, 3],
           [6, 1, 2, 3]])

我想按降序对此矩阵的行进行排序,并获取已排序矩阵的参数,如下所示:

As = array([[3, 1, 2, 0],
            [1, 3, 0, 2],
            [0, 3, 2, 1]])

我做了以下事情:

import numpy
A = numpy.array([[1, 3, 2, 7], [2, 4, 1, 3], [6, 1, 2, 3]])
As = numpy.argsort(A, axis=1)

但是这样会以升序对我进行排序。在花费一些时间在互联网上寻找解决方案后,我期望numpy的argsort函数中必须存在一个参数可以将排序顺序反转。但是,显然不存在这样的参数!为什么呢!?

有一个名为order的参数。我尝试了猜测的numpy.argsort(..., order=reverse),但它不起作用。

我在这里查找以前问题的解决方案,发现我可以执行以下操作:

import numpy
A = numpy.array([[1, 3, 2, 7], [2, 4, 1, 3], [6, 1, 2, 3]])
As = numpy.argsort(A, axis=1)
As = As[::-1]

由于某些原因,As = As[::-1]并未给我所需的输出。

嗯,我想这一定很简单,但我还是缺少了什么。

我该如何按降序对一个numpy数组进行排序?


3
你需要使用np.argsort(A, axis=1)[:, ::-1]。只使用[::-1]会颠倒轴0:你需要颠倒轴1。 - Alex Riley
我想问一下,您的顶部示例中的 As 不是 A 的排序版本,而是另一个矩阵的排序版本,我的理解是否正确? - Swier
这是 A 排序后的参数。@Swier - Ribz
1
还有两种hackish的方法:np.argsort(-A, axis=1)A.shape[1] -1 - np.argsort(A, axis=1) - Divakar
2
NumPy的sortargsort函数中没有reverse选项,因为反转数组非常高效(它只改变步幅,不需要复制数据)。通过对-A进行排序的解决方案可以工作,但这会创建两个新数组而不是一个。对于大型数组来说,这并不是很好。 - Alex Riley
显示剩余2条评论
1个回答

36

只需将您的矩阵乘以-1即可颠倒顺序:

[In]: A = np.array([[1, 3, 2, 7],
                    [2, 4, 1, 3],
                    [6, 1, 2, 3]])
[In]: print( np.argsort(-A) )
[Out]: [[3 1 2 0]
        [1 3 0 2]
        [0 3 2 1]]

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