행렬의 전치(Transpose)란 행렬의 열(column)을 행(row)으로 바꾸는 작업을 의미합니다. 예시를 통해 전치 후 행렬이 어떤 모습이 되는지 살펴보겠습니다.
다음과 같은 원본 행렬이 있다고 가정해 보겠습니다.
x = [[1,2],[3,4],[5,6]]
위 행렬 'x'에는 두 개의 열이 있으며, 첫 번째 열은 1, 3, 5이고 두 번째 열은 2, 4, 6입니다.
이 행렬 'x'를 전치하면 열이 행으로 바뀌게 됩니다. 따라서 전치된 행렬은 다음과 같은 형태가 됩니다.
x1 = [[1, 3, 5],[2, 4, 6]]
즉, 새로운 행렬 'x1'은 같은 값들을 가지지만 배치 구조가 다른 행렬입니다.
아래에서 Python으로 행렬을 전치하는 몇 가지 방법을 소개합니다.
방법 1 - 중첩 루프(Nested Loop)를 이용한 전치
# 원본 행렬
x = [[1,2],[3,4],[5,6]]
result = [[0, 0, 0], [0, 0, 0]]
# 행 반복
for i in range(len(x)):
# 열 반복
for j in range(len(x[0])):
result[j][i] = x[i][j]
for r in result:
print(r)실행 결과
[1, 3, 5] [2, 4, 6]
중첩 루프를 사용하면 각 요소의 위치를 직접 바꿔주기 때문에 전치 과정을 명확하게 이해할 수 있습니다.
방법 2 - 중첩 리스트 컴프리헨션(Nested List Comprehension)을 이용한 전치
# 원본 행렬
x = [[1,2],[3,4],[5,6]]
result = [[x[j][i] for j in range(len(x))] for i in range(len(x[0]))]
for r in result:
print(r)실행 결과
[1, 3, 5] [2, 4, 6]
리스트 컴프리헨션을 활용하면 코드를 훨씬 간결하게 작성할 수 있으며, Python에서 자주 사용되는 관용적인 기법입니다.
방법 3 - zip() 함수를 이용한 전치
# 원본 행렬
x = [[1,2],[3,4],[5,6]]
result = map(list, zip(*x))
for r in result:
print(r)실행 결과
[1, 3, 5] [2, 4, 6]
zip(*x)처럼 언패킹 연산자(*)와 함께 zip 함수를 사용하면 단 한 줄로 행렬을 전치할 수 있어 매우 효율적입니다.
방법 4 - NumPy 라이브러리를 이용한 전치
NumPy는 대규모 다차원 배열을 효율적으로 처리하기 위해 만들어진 배열 처리 패키지입니다. 과학 계산 및 데이터 분석에서 널리 사용됩니다.
import numpy # 원본 행렬 x = [[1,2],[3,4],[5,6]] print(numpy.transpose(x))
실행 결과
[[1 3 5] [2 4 6]]
NumPy의 transpose() 함수를 사용하면 별도의 반복문 없이 손쉽게 행렬을 전치할 수 있으며, 대용량 데이터를 다룰 때 특히 유용합니다.