2014-06-20 118 views
3

我想知道如何能夠通過其中一列中的值對整個數組進行排序。如何根據特定行中的值對numpy數組進行排序?

我:

array([5,2,8,2,4]) 

和:

array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

我想第一個數組追加到第二個這樣的:

array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24], 
     [5, 2, 8, 2, 4]]) 

然後由數組排序附加的行得到這個:

array([[1, 3, 4, 0, 2], 
     [6, 8, 9, 5, 7], 
     [11, 13, 14, 10, 12], 
     [16, 18, 19, 15, 17], 
     [21, 23, 24, 20, 22], 
     [2, 2, 4, 5, 8]]) 

或本:

array([[ 2, 1, 3, 4, 0], 
     [ 7, 6, 8, 9, 5], 
     [12, 11, 13, 14, 10], 
     [17, 16, 18, 19, 15], 
     [22, 21, 23, 24, 20], 
     [ 8, 5, 4, 2, 2]]) 

,然後取下附列獲得:

array([[1, 3, 4, 0, 2], 
     [6, 8, 9, 5, 7], 
     [11, 13, 14, 10, 12], 
     [16, 18, 19, 15, 17], 
     [21, 23, 24, 20, 22]]) 

或:

array([[ 2, 1, 3, 4, 0], 
     [ 7, 6, 8, 9, 5], 
     [12, 11, 13, 14, 10], 
     [17, 16, 18, 19, 15], 
     [22, 21, 23, 24, 20]]) 

有沒有執行這一程序代碼。我對python非常陌生。非常感謝!

回答

6

您可以使用numpy.argsort獲取數組排序索引的列表。使用它你可以重新排列矩陣的列。

import numpy as np 

c = np.array([5,2,8,2,4])  
a = np.array([[ 0, 1, 2, 3, 4], 
       [ 5, 6, 7, 8, 9], 
       [10, 11, 12, 13, 14], 
       [15, 16, 17, 18, 19], 
       [20, 21, 22, 23, 24]]) 

i = np.argsort(c) 
a = a[:,i] 
+0

謝謝,它的作品很神奇!你會不會知道它是如何工作的,因爲我似乎無法從代碼和文檔中找到它?謝謝! – tooty44

+1

'argsort'返回一個將對數組進行排序的索引數組。 'i'中的第一個元素是'c'中具有最低值的位置,等等。您可以使用列表來索引numpy數組,因此'c [i]'會爲您提供'c'的排序版本。將其擴展到2D數組,您可以使用列表選擇一堆行或(在本例中)列。你想按照'i'指定的順序來處理列,但是你想要所有的行都不變,因此':'(這是一個覆蓋所有行的切片)。你應該在numpy中找到關於切片和索引的教程,因爲它是非常重要的東西。 – pezcode

1

你不需要numpy來做到這一點; (但如果你正在使用numpy的,你可以只使用數組類的.transpose()方法。

這本質上確實是轉你的陣列,它的array[column][row],然後取每個列,對它們與SORTKEYS你提供了一個元組列表(zip(sortKeys, a)位),然後它對這個元組列表進行排序。默認情況下,根據它們的第一個值,第二個值,第三個元素,等等排序元組。順序。

然後aNew = [...]只提取列在array[column][row]格式創建新的陣列,還,然後再對調了。

a = [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19], 
    [20, 21, 22, 23, 24]] 

#transpose a 
a = zip(*a) 

sortKeys = [5,2,8,2,4] 

b = zip(sortKeys, a) 

aNew = [row[1] for row in sorted(b)] 

#transpose a back 
aNew = zip(*aNew) 

print aNew 
相關問題