对数组进行排序并将索引追溯到其排序顺序

时间:2017-09-13 16:35:58

标签: python arrays numpy matrix

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

[[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)

我已尝试使用<button pButton type="button" (click)="incrementCpt().bind(this)" label="+"></button> ,但这并未提供所需的输出,可能是我使用不正确。相同的操作将适用于第二个数组但在列级别。任何帮助,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试按排序顺序追溯元素位置。

方法#1:一种方法是使用argsort两次,就像这样 -

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