对数组进行排序,然后将索引回到分类顺序中



我正在尝试对此数组进行排序,

[[15 12 10 8 7]
[7 8 4 3 1]
[8 5 9 12 4]
[6 10 14 7 5]] 

to

[[5 4 3 2 1]
[4 5 3 2 1]
[3 2 4 5 1]
[2 4 5 3 1]]

我尝试使用nm.argsort(a, axis=1),但这并没有给出所需的输出,可能是我错误地使用它。同一操作将适用于第二个数组,但在列级。任何帮助,将不胜感激。谢谢。

看来您正在尝试按顺序追溯元素位置。

方法#1:这样做的一种方法是两次使用argsort,例如So -

a.argsort(1).argsort(1)+1

方法#2:this post启发的有效方法 -

def argsort_unique2D(idx):
    m,n = idx.shape
    sidx = np.empty((m,n),dtype=int)
    sidx[np.arange(m)[:,None], idx] = np.arange(n)
    return sidx
out = argsort_unique2D(a.argsort(1))+1

样本运行 -

In [42]: a
Out[42]: 
array([[15, 12, 10,  8,  7],
       [ 7,  8,  4,  3,  1],
       [ 8,  5,  9, 12,  4],
       [ 6, 10, 14,  7,  5]])
In [43]: a.argsort(1).argsort(1)+1
Out[43]: 
array([[5, 4, 3, 2, 1],
       [4, 5, 3, 2, 1],
       [3, 2, 4, 5, 1],
       [2, 4, 5, 3, 1]])
In [71]: argsort_unique2D(a.argsort(1))+1
Out[71]: 
array([[5, 4, 3, 2, 1],
       [4, 5, 3, 2, 1],
       [3, 2, 4, 5, 1],
       [2, 4, 5, 3, 1]])

运行时测试 -

In [76]: a = np.random.rand(100,10000)
In [77]: %timeit a.argsort(1).argsort(1)+1
10 loops, best of 3: 115 ms per loop
In [78]: %timeit argsort_unique2D(a.argsort(1))+1
10 loops, best of 3: 67.8 ms per loop

最新更新