2013-08-31 6 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 일 의미한다. 라벨과

매트릭스 :

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 행렬에 새로운 요소를 형성하기 위해 그룹화 된 요소의 합계 수

. 세 번째 열과 행은 레이블 값이 더 낮기 때문에 앞/위쪽으로 이동했습니다 (1 대 2 및 3).

질문 : numpy로 이런 식으로 행렬을 정렬하는 방법은 무엇입니까? 나는 다른 질문을 검색하여 lexsort, 레코드 배열 및 기타 항목을 찾았지만 numpy에 대한 많은 경험이없는 사람으로서 필자는 내가 원하는 정렬을 수행하기가 어려웠다. 사전에

감사합니다!

답변

4

numpy을 사용하면 배열이나 목록을 색인 할 수 있으므로 열과 행의 순서를 쉽게 변경할 수 있습니다.

>>> 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 = 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([[ 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를 사용합니다. –

관련 문제