2013-08-31 57 views
2

我有一個正方形的NxN矩陣。這個矩陣通常很大(N大約爲5000),我想聚合這個矩陣的一部分來創建一個更小的矩陣。用numpy對另一個列表中的行和列進行排序

因此,我有一個包含N個元素的列表,這些元素表示應在新矩陣中將哪些行/列組合在一起。

爲了使算法更容易和更快捷,我想根據上面的列表對行和列進行排序。

實施例:

輸入5x5矩陣:

row/col | 1 | 2 | 3 | 4 | 5 | 
     1 | 5 | 4 | 3 | 2 | 1 | 
     2 | 10 | 9 | 8 | 7 | 6 | 
     3 | 15 | 14 | 13 | 12 | 11 | 
     4 | 20 | 19 | 18 | 17 | 16 | 
     5 | 25 | 24 | 23 | 22 | 21 | 

需要明確的是:在第一行是[5 4 3 2 1]和第一列是[5,10,15,20, 25]。

含有「標籤」,這表示它的行和列,應在新的矩陣組合在一起的列表:

[2 2 1 3 3] 

這意味着新的矩陣將是3×3(我們有3個不同的值)。

有標籤的矩陣:

labels    2  1  3 
       --------- ---- --------- 
     row/col | 1 | 2 | 3 | 4 | 5 | 
    2 |  1 | 5 | 4 | 3 | 2 | 1 | 
    2 |  2 | 10 | 9 | 8 | 7 | 6 | 
    1 |  3 | 15 | 14 | 13 | 12 | 11 | 
    3 |  4 | 20 | 19 | 18 | 17 | 16 | 
    3 |  5 | 25 | 24 | 23 | 22 | 21 | 

預期排序矩陣:

row/col | 3 | 1 | 2 | 4 | 5 | 
     3 | 13 |15 | 14 | 12 | 11 | 
     1 | 3 | 5 | 4 | 2 | 1 | 
     2 | 8 |10 | 9 | 7 | 6 | 
     4 | 18 |20 | 19 | 17 | 16 | 
     5 | 23 |25 | 24 | 22 | 21 | 

而與此矩陣I可以很容易地求和分組元素,以在所述3×3矩陣的新元素。請注意,第三列和第三行已移至前/後,因爲它的標籤值較低(1對2和3)。

問題:如何用numpy以這種方式對矩陣進行排序?我搜索了其他問題,發現了lexsort,記錄陣列和其他東西,但作爲一個沒有太多numpy經驗的人,我發現很難完成我想要的排序。

在此先感謝!

回答

4

numpy允許您對數組或列表進行索引,因此更改列和行的順序非常簡單。

我認爲這是你在找什麼:

>>> a = np.arange(25).reshape(5,5) 
>>> a 
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]]) 

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

作爲一個側面說明:

如果你想改變只有一排排的順序:

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

如果您想改變列的順序:

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

啊,是的,和'numpy.lexsort'一起,我現在有一個可行的解決方案。我使用lexsort生成帶有索引的列表。 –

相關問題