Acu*_*nus 2 sorting numpy matrix-indexing
我可以对 numpy 数组进行就地反向排序(降序排序),但我还需要能够稍后对其进行取消排序(撤消)。
给出一个未排序的例子:
a = np.array([-1, -2, 1, -3, 2, 0])
Run Code Online (Sandbox Code Playgroud)
我试过:
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])
Run Code Online (Sandbox Code Playgroud)
上面的方法不起作用。正确的方法是什么i?假设数组非常大,因此我们不想制作任何不必要的副本。
下面的习惯用法 (O(n)) 比第二个 argsort (O(n log n)) 更便宜。
x具有排序顺序的示例数组y
>>> x = np.random.random(10)
>>> y = x.argsort()[::-1]
Run Code Online (Sandbox Code Playgroud)
构建逆i
>>> i = np.empty_like(y)
>>> i[y] = np.arange(y.size)
Run Code Online (Sandbox Code Playgroud)
查看:
>>> 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])
Run Code Online (Sandbox Code Playgroud)