我正在尝试对此数组进行排序,
[[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