【发布时间】:2020-01-15 11:02:57
【问题描述】:
我正在沿轴对一个大型多维 numpy 数组进行排序。 经过一些计算后,我想撤消排序,因为值本身与我进行初始排序时不同。
最初我尝试通过简单地反转排序索引,但如果数组首先已经正确排序,这当然没有任何意义,请参见下面的代码。
import numpy as np
array = np.random.rand(100,2,4)
array.out = array
arg = array.argsort(axis=1)
arg_rev = arg.argsort(axis=1)
# this solution is based on https://github.com/numpy/numpy/issues/4724
for i in range(0, array.shape[2]):
tmp = array[:,:,i]
array.out[:,:,i] = tmp[np.arange(np.shape(tmp)[0])[:, np.newaxis], arg_ftc_rev[:,:,i]]
我想将此解决方案与来自 undo or reverse argsort(), python 的解决方案结合起来,而不必循环额外的数组索引。
# ( a = np.random.randint(0,10,10)
# aa = np.argsort(a)
# aaa = np.argsort(aa) )
# e.g.
array.out[:,:,i] = tmp[np.arange(np.shape(tmp)[0])[:, np.newaxis], arg_ftc[:,:,i][arg_ftc_rev[:,:,i]]
但这不起作用,因为它会导致错误的形状。
【问题讨论】:
-
“更改值后撤消排序”是一个非常模糊的概念。你能提供一个你想要完成的例子(带数据)吗?
-
使用this answer末尾的
inverse_permutation函数来反转argsort的结果。 -
@jdehesa 我试过
python import numpy as np array = np.random.rand(100,2,4) arg = array.argsort(axis=1) x = inverse_permutation(arg),但是因为无法广播而出现错误。 -
@ScottHunter 我的意思是每个元素在排序轴上的位置应该与开头一样,但是其中的值将被修改。因此,简单地再次排序是没有选择的,例如
python x = [1, 3, 1, 6] x = sort(x) # [1, 1, 3, 6] x = x*2 # [2, 2, 6, 12] # undo sorting # [2, 6, 2, 12]
标签: python numpy sorting multidimensional-array