NumPy:取消/取消反向/降序排序

时间:2018-10-15 22:11:54

标签: sorting numpy matrix-indexing

我可以对numpy数组进行就地反向排序(降序排序),但我还需要稍后能够对其进行取消排序(撤消)操作。

给出一个未排序的示例:

a = np.array([-1, -2,  1, -3,  2,  0])

我尝试过:

i = a[::-1].argsort().argsort()  # BAD attempt to store original index
# i = array([3, 5, 0, 4, 1, 2])

a[::-1].sort()  # in-place reverse sort (works correctly)
# a= array([ 2,  1,  0, -1, -2, -3])

a = a[i]  # FAILS to restore original a
# a = array([-1, -3,  2, -2,  1,  0])

以上操作无效。正确的i会起作用吗?请假设数组很大,所以我们不想制作任何不必要的副本。

2 个答案:

答案 0 :(得分:2)

以下成语(O(n))比第二个argsort(O(n log n))便宜。

示例数组x的排序顺序为y

>>> x = np.random.random(10)
>>> y = x.argsort()[::-1]

建立逆向i

>>> i = np.empty_like(y)
>>> i[y] = np.arange(y.size)

检查:

>>> x
array([0.44257134, 0.573158  , 0.07762422, 0.31507426, 0.43414726,
       0.34923861, 0.22161337, 0.14090133, 0.66903264, 0.38888105])
>>> x[y]
array([0.66903264, 0.573158  , 0.44257134, 0.43414726, 0.38888105,
       0.34923861, 0.31507426, 0.22161337, 0.14090133, 0.07762422])
>>> x[y][i]
array([0.44257134, 0.573158  , 0.07762422, 0.31507426, 0.43414726,
       0.34923861, 0.22161337, 0.14090133, 0.66903264, 0.38888105])

答案 1 :(得分:1)

给出未排序的示例:

a = np.array([-1, -2,  1, -3,  2,  0])

要取消排序/撤消其反向/降序排序:

i = a.argsort()[::-1]
# i = array([4, 2, 5, 0, 1, 3])

a = a[i]  # descending sort using i
# a = array([ 2,  1,  0, -1, -2, -3])

a = a[i.argsort()]  # unsort using i
# a = array([-1, -2,  1, -3,  2,  0])

信用:这个答案是由有关如何unsort a sort的动机引起的,这与反向排序无关。