按字典序对2维numpy数组进行排序

13

我有一个拥有数百列的大型二维数组。我想按字典顺序对它进行排序,即先按第一列排序,然后按第二列排序,直到最后一列。我想这应该很容易做到,但我还没有找到一个快速的方法来实现它。

1个回答

24

这就是numpy.lexsort的用途,但它的接口不太方便。将一个二维数组传递给它,它将对进行argsort排序,首先按照最后一行,然后是倒数第二行,一直到第一行:

>>> x
array([[0, 0, 0, 2, 3],
       [2, 3, 2, 3, 2],
       [3, 1, 3, 0, 0],
       [3, 1, 1, 3, 1]])
>>> numpy.lexsort(x)
array([4, 1, 2, 3, 0], dtype=int64)

如果你想按行排序,以第一列作为主键,那么在使用lexsort之前,你需要旋转数组:

>>> x[numpy.lexsort(numpy.rot90(x))]
array([[0, 0, 0, 2, 3],
       [2, 3, 2, 3, 2],
       [3, 1, 1, 3, 1],
       [3, 1, 3, 0, 0]])

太好了,这似乎有效!那么我需要在其中执行searchsorted,但不确定如何操作。因此,给定一个一维数组,我想找出它是否是2D数组排序后的行之一。任何建议都将不胜感激。 - grigor
@grigor:也许 [all(row == t) for row in x] - user66081
4
可以补充说,有一种更节省时间的方法可以获得与“rot90”相同的结果,即使用“x [numpy.lexsort(x.T [:: -1])]” 。根据“timeit”的测试结果,在“x.shape == (1000,5)”时,这种方法比“x [numpy.lexsort(numpy.rot90(x))]”快约25%。 - MrArsGravis

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