2011-11-16 28 views
5

一個numpy的陣列我有我所用numpy.array製作成一個數組列表有點像一臺

[[0, 3], [5, 1], [2, 1], [4, 5]] 

[[0 3] 
[5 1] 
[2 1] 
[4 5]] 

如何解決這就像一個表?特別是,我想按升序對第二列進行排序,然後通過將第一列按升序排序來解決任何關係。因此,我希望:

[[2 1] 
[5 1] 
[0 3] 
[4 5]] 

任何幫助將不勝感激!

回答

4

您可以使用numpy.lexsort()

>>> a = numpy.array([[0, 3], [5, 1], [2, 1], [4, 5]]) 
>>> a[numpy.lexsort(a.T)] 
array([[2, 1], 
     [5, 1], 
     [0, 3], 
     [4, 5]]) 
2

一這樣做的反璞歸真方式 - 切出你想要的數據的比特,使用argsort得到的排序指標,然後使用這個結果切片原來的數組:

a = np.array([[0, 3], [5, 1], [2, 1], [4, 5]]) 

subarray = a[:,1] # 3,1,1,5 

indices = np.argsort(subarray) # Returns array([1,2,0,3]) 

result = a[indices] 

或者,所有一氣呵成:

a[np.argsort(a[:,1])] 
+2

這不必排序關係(第1列按升序排列)。 – Bruno

+0

真 - lexsort在這裏看起來像一個更好的選擇 – FredL

1

如果你想使用僅限於單列(例如,第二列),你可以這樣做排序:

from operator import itemgetter 
a = [[0, 3], [5, 1], [2, 1], [4, 5]] 
a_sorted = sorted(a, key=itemgetter(1)) 

如果有不止一個鍵,然後用numpy.lexsort()正如第四節所指出的那樣其他答案。

+0

謝謝,對於我的情況'numpy.array(sorted(a,key = itemgetter(1)))'完美地工作仍然是最可讀的選項。 – firegurafiku

相關問題