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

파이썬으로 두 행렬을 곱하는 방법 완벽 가이드

두 행렬의 곱셈은 첫 번째 행렬의 열(column) 개수와 두 번째 행렬의 행(row) 개수가 같을 때에만 가능합니다. 이 조건이 충족되지 않으면 행렬 곱셈을 수행할 수 없습니다.

행렬 곱셈의 기본 원리

파이썬에서는 중첩 루프(nested loop)를 사용하여 행렬 곱셈을 구현할 수 있습니다. 아래 예제 프로그램은 각각 3개의 행과 3개의 열을 가진 두 행렬 X와 Y를 다룹니다. 곱셈 결과로 생성되는 행렬 Z 역시 3×3 구조를 갖게 됩니다.

행렬 곱셈의 핵심 원리는 다음과 같습니다. 첫 번째 행렬의 각 행에 있는 요소들을 두 번째 행렬의 해당 열에 있는 요소들과 하나씩 곱한 후, 그 결과를 모두 더하여 새로운 행렬의 요소를 만듭니다.

예제 코드

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

Y = [[10,11,12],
     [13,14,15],
     [16,17,18]]

result = [[0,0,0],
          [0,0,0],
          [0,0,0]]

# X의 행을 순회
for i in range(len(X)):
    for j in range(len(Y[0])):
        for k in range(len(Y)):
            result[i][j] += X[i][k] * Y[k][j]

for r in result:
    print(r)

실행 결과

[84, 90, 96]
[201, 216, 231]
[318, 342, 366]

코드 동작 방식 설명

위 코드에서 세 개의 중첩된 for 루프가 사용됩니다.

첫 번째 루프(i)는 첫 번째 행렬 X의 행을 순회하고, 두 번째 루프(j)는 두 번째 행렬 Y의 열을 순회하며, 세 번째 루프(k)는 실제 곱셈과 덧셈 연산을 수행합니다.

예를 들어 result[0][0] 값인 84는 다음과 같이 계산됩니다.

(1×10) + (2×13) + (3×16) = 10 + 26 + 48 = 84

NumPy를 활용한 더 간단한 방법

실무에서는 NumPy 라이브러리를 사용하면 훨씬 간결하게 행렬 곱셈을 수행할 수 있습니다.

import numpy as np

X = np.array([[1,2,3],[4,5,6],[7,8,9]])
Y = np.array([[10,11,12],[13,14,15],[16,17,18]])

result = np.dot(X, Y)
print(result)

NumPy의 np.dot() 함수 또는 @ 연산자를 사용하면 내부적으로 최적화된 연산이 수행되어, 큰 규모의 행렬에서도 중첩 루프 방식보다 훨씬 빠른 성능을 보여줍니다.