如何以这种特定方式对2D numpy数组进行排序

时间:2019-03-11 18:34:20

标签: python arrays numpy sorting

我意识到这里已经有很多“如何对numpy数组进行排序”的问题。但是我找不到如何以这种特定方式进行操作。

我有一个与此类似的数组:

array([[1,0,1,],
    [0,0,1],
    [1,1,1],
    [1,1,0]])

我想对行进行排序,使行内的顺序保持相同。所以我希望得到以下输出:

array([[0,0,1,],
    [1,0,1],
    [1,1,0],
    [1,1,1]])

1 个答案:

答案 0 :(得分:3)

您可以使用dotargsort

a[a.dot(2**np.arange(a.shape[1])[::-1]).argsort()]
# array([[0, 0, 1],
#        [1, 0, 1],
#        [1, 1, 0],
#        [1, 1, 1]])

想法是将行转换为整数。

a.dot(2**np.arange(a.shape[1])[::-1])
# array([5, 1, 7, 6])

然后,找到排序的索引,并使用它对a重新排序:

a.dot(2**np.arange(a.shape[1])[::-1]).argsort()
# array([1, 0, 3, 2])

我的测试表明,这比lexsort快一点。

a = a.repeat(1000, axis=0)

%timeit a[np.lexsort(a.T[::-1])]
%timeit a[a.dot(2**np.arange(a.shape[1])[::-1]).argsort()]

230 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
192 µs ± 4.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

验证正确性:

np.array_equal(a[a.dot(2**np.arange(a.shape[1])[::-1]).argsort()], 
               a[np.lexsort(a.T[::-1])])
# True