我正在尝试对此数组进行排序,
[[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>
,但这并未提供所需的输出,可能是我使用不正确。相同的操作将适用于第二个数组但在列级别。任何帮助,将不胜感激。感谢。
答案 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