解決方案:
>>> a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)]
array([[1, 2, 3],
[2, 8, 9]])
你得到它的權利,但我不會把它描述爲欺騙索引。
也許這將有助於更清楚:
In [544]: i=np.argsort(a,axis=1)
In [545]: i
Out[545]:
array([[1, 2, 0],
[2, 0, 1]])
i
是我們想要的順序,每一行。即:
In [546]: a[0, i[0,:]]
Out[546]: array([1, 2, 3])
In [547]: a[1, i[1,:]]
Out[547]: array([2, 8, 9])
要同時執行兩個索引步驟,我們必須對第1維使用「列」索引。
In [548]: a[[[0],[1]],i]
Out[548]:
array([[1, 2, 3],
[2, 8, 9]])
可與i
配對另一個陣列是:
In [560]: j=np.array([[0,0,0],[1,1,1]])
In [561]: j
Out[561]:
array([[0, 0, 0],
[1, 1, 1]])
In [562]: a[j,i]
Out[562]:
array([[1, 2, 3],
[2, 8, 9]])
i
如果標識該列的每個元素,然後j
指定每個要素的行。 [[0],[1]]
列數組的工作原理也是如此,因爲它可以在i
之間進行廣播。
我覺得
np.array([[0],
[1]])
爲 '手短' 爲j
。他們一起定義新陣列每個元素的源行和列。他們一起工作,而不是順序。
從a
到新陣列的完整映射:
[a[0,1] a[0,2] a[0,0]
a[1,2] a[1,0] a[1,1]]
def foo(a):
i = np.argsort(a, axis=1)
return (np.arange(a.shape[0])[:,None], i)
In [61]: foo(a)
Out[61]:
(array([[0],
[1]]), array([[1, 2, 0],
[2, 0, 1]], dtype=int32))
In [62]: a[foo(a)]
Out[62]:
array([[1, 2, 3],
[2, 8, 9]])
謝謝@hpaulj,真正有用的解釋!如果你有秒,你能解釋'第一維'的列索引嗎?這只是將數組轉換爲(2,1,3)右...爲什麼這會促進'i'切片? – DilithiumMatrix
我擴展了我的解釋。 – hpaulj
有沒有更簡單的方法呢?我認爲這個argsort應該考慮它在排序數組後會用到什麼嗎?..... – Martian2049