2012-05-31 5 views
1

정사각형 행렬의 삼각형 (위 또는 아래) 중 하나의 모든 원소를 반환하는 함수가 numpy/scipy에 있습니까?파이썬에서 정사각형 행렬의 위 또는 아래 삼각형의 모든 요소를 ​​가져옵니다.

예컨대 :

matrix = [[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]] 

삼각형 (상하) :

up = [1,2,3,5,6,9] 
down = [1,4,5,7,8,9] 

또는

up = [1,2,5,3,6,9] 
down = [1,4,7,5,8,9] 

감사합니다!

편집 :

예 당신이 할 수 있도록 두 가지 기능이 있다는 것을 : np.triu_indices(n) (위쪽 삼각형)와 np.tril_indices(n) (낮은 삼각형).

감사합니다. katrielalex!

+1

, 행렬이에 분할을 주 삼각형 행렬에 주 대각선. 이것은 또한 관련된 NumPy 함수의 기능입니다. 대각선 문제를 선택합니까? –

+0

기본적으로 대각선으로 행렬을 슬라이스하고 대각선을 포함하여 위 또는 아래 삼각형을 유지하려고합니다. np.diagonal() 함수는 행렬의 대각선 요소 만 반환합니다. –

+2

요점은 예제가 왼쪽 하단 모서리에서 오른쪽 상단 모서리까지의 대각선을 사용한다는 것입니다. 이것은 매우 이상합니다. 관련된 모든 NumPy 함수 (numpy.diagonal() 포함)는 주 대각선, 즉 왼쪽 상단 모서리에서 오른쪽 하단 모서리까지의 대각선을 사용합니다. 따라서 제 질문은 : "잘못된"대각선을 사용해야합니까? –

답변

7

요소의 순서가 중요합니까?

일반적으로 행렬의 위쪽 삼각형과 아래쪽 삼각형은 기타 대각선 (왼쪽에서 오른쪽 하단)으로 표시됩니다. 이 문제를 해결하려면 np.fliplr(matrix)으로 할 수있는 두 대각선을 "뒤집어"해야합니다. 그러면 올바른 요소를 얻을 수 있지만 "자연"순서 (각 행이 짧아짐)가됩니다. 다른 방법 (np.flipud)을 뒤집어서 열 단위 순서를 얻을 수도 있습니다. 그러나 나는 한 번에 대각선 하나를 읽지 않고 "작은 대각선 읽기"명령을 사용하는 방법을 모른다.

대각선 요소를 얻으려면 np.triu_indices (또는 아래쪽 삼각형의 경우 np.tril_indices)으로 색인을 가져온 다음 색인을 생성 할 수 있습니다.

>>> matrix 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 
>>> np.fliplr(matrix)[np.triu_indices(3)] 
array([3, 2, 1, 5, 4, 7]) 
2

다음 코드는 대각선을 포함하여 아래 삼각형 추출 :

hstack(mat[i][:i+1] for i in xrange(mat.shape[0])) 

을이 대각선없이 낮은 삼각형 추출 :

보통
hstack(mat[i][:i] for i in xrange(mat.shape[0])) 
관련 문제