Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 행렬의 전치(Transpose) 구하기: 초보자를 위한 완벽 가이드

이 글에서는 파이썬을 이용해 행렬의 전치(transpose)를 구하는 방법을 단계별로 알아보겠습니다.

문제 정의

주어진 문제는 다음과 같습니다.

문제: 하나의 행렬이 주어졌을 때, 그 행렬의 전치 행렬을 구하여 출력해야 합니다.

행렬의 전치란 원래 행렬 A에서 A[i][j] 위치에 있던 값을 A[j][i] 위치로 바꾼 새로운 행렬을 의미합니다. 쉽게 말해, 행과 열을 서로 뒤바꾸는 연산입니다.

그럼 실제 구현 예제를 통해 개념을 자세히 살펴보겠습니다.

방법 1: 새로운 행렬을 만들어 전치 결과 저장하기

첫 번째 방법은 입력 행렬의 전치 결과를 별도의 새로운 행렬 B에 저장하는 방식입니다. 원본 행렬을 유지해야 하는 경우에 유용합니다.

예제 코드

def transpose(A, B):
    for i in range(M):
        for j in range(N):
            B[i][j] = A[j][i]

# 드라이버 코드
M = N = 4
A = [ [0, 1, 1, 0],
      [0, 2, 0, 2],
      [0, 3, 0, 3],
      [0, 0, 4, 4]]
B = [[0 for x in range(M)] for y in range(N)]  # 빈 행렬 생성
transpose(A, B)

print("전치된 행렬은 다음과 같습니다:")
for i in range(N):
    for j in range(N):
        print(B[i][j], " ", end='')
    print()

실행 결과

전치된 행렬은 다음과 같습니다:
0 0 0 0
0 2 3 0
0 3 0 4
0 0 4 4

방법 2: 입력 행렬 자체에 전치 결과 저장하기 (제자리 전치)

두 번째 방법은 추가 메모리 없이 입력 행렬 자체를 수정하는 제자리(in-place) 방식입니다. 대각선 기준으로 위쪽 삼각형의 요소들만 아래쪽과 맞바꾸면 되므로 효율적입니다.

예제 코드

# 함수 정의
def transpose(A):
    for i in range(M):
        for j in range(i+1, N):
            A[i][j], A[j][i] = A[j][i], A[i][j]

M = N = 4
A = [ [0, 1, 1, 0],
      [0, 2, 0, 2],
      [0, 3, 0, 3],
      [0, 0, 4, 4]]
transpose(A)

print("전치된 행렬은 다음과 같습니다:")
for i in range(M):
    for j in range(N):
        print(A[i][j], " ", end='')
    print()

실행 결과

전치된 행렬은 다음과 같습니다:
0 0 0 0
0 2 3 0
0 3 0 4
0 0 4 4

추가 팁: zip() 함수 활용하기

파이썬에서는 내장 함수인 zip()을 사용하면 한 줄로 전치 행렬을 만들 수 있습니다.

A = [[0, 1, 1, 0],
     [0, 2, 0, 2],
     [0, 3, 0, 3],
     [0, 0, 4, 4]]

T = [list(row) for row in zip(*A)]
print(T)

zip(*A)는 각 행을 인수로 풀어서(unpacking) 같은 인덱스의 요소들을 묶어주기 때문에, 결과적으로 열 단위로 데이터가 재배열되어 전치 행렬이 완성됩니다.

결론

이번 글에서는 파이썬에서 행렬의 전치를 구하는 두 가지 방법, 즉 새로운 행렬에 결과를 저장하는 방법과 입력 행렬을 직접 수정하는 제자리 방식을 학습했습니다. 또한 zip(*A)를 활용한 파이썬다운 간결한 방법도 함께 소개했습니다. 상황에 따라 메모리 효율성과 코드 가독성을 고려해 적절한 방법을 선택하시기 바랍니다.