2015-06-01 93 views
8

如果我們有一維數組有numpy的argsort返回二維索引數組?

arr = np.random.randint(7, size=(5)) 
# [3 1 4 6 2] 
print np.argsort(arr) 
# [1 4 0 2 3] <= The indices in the sorted order  

如果我們有一個二維數組

arr = np.random.randint(7, size=(3, 3)) 
# [[5 2 4] 
# [3 3 3] 
# [6 1 2]] 
print np.argsort(arr) 
# [[1 2 0] 
# [0 1 2] 
# [1 2 0]] <= It sorts each row 

我需要的是2D指數那種該矩陣在它的全部。這樣的事情:

# [[2 1] => 1 
# [0 1] => 2 
# [2 2] => 2 
# . 
# . 
# . 
# [0 2] => 4 
# [0 0] => 5 
# [2 0]] => 6 

如何獲得2d數組排序的「2d指數」?

回答

18

扁平陣列上應用numpy.argsort然後解開指數回(3,3)形狀:

>>> arr = np.array([[5, 2, 4], 
[3, 3, 3], 
[6, 1, 2]]) 
>>> np.dstack(np.unravel_index(np.argsort(arr.ravel()), (3, 3))) 
array([[[2, 1], 
     [0, 1], 
     [2, 2], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [0, 2], 
     [0, 0], 
     [2, 0]]]) 
+1

jezz,這是什麼結果......? – Martian2049