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

파이썬 NumPy로 행렬 곱셈 한 줄로 처리하는 방법

행렬 곱셈은 첫 번째 행렬의 각 행과 두 번째 행렬의 각 열에 있는 원소들을 서로 곱한 뒤 더하는 과정을 반복해야 하는 다소 복잡한 연산입니다. 행렬 곱셈이 성립하려면 첫 번째 행렬의 열 개수와 두 번째 행렬의 행 개수가 같아야 하며, 결과 행렬은 첫 번째 행렬의 행 개수와 두 번째 행렬의 열 개수를 가지게 됩니다.

크기가 작은 행렬이라면 중첩 for 루프를 직접 작성해 결과를 구할 수 있습니다. 하지만 큰 행렬을 다룰 때는 파이썬의 내장 기능을 활용하는 것이 훨씬 효율적입니다. 아래에서 두 가지 방법을 모두 살펴보겠습니다.

for 루프 사용하기

여기서는 2x3과 3x2(행 x 열) 크기의 두 행렬을 사용합니다. 행렬 곱셈의 결과는 2x2 행렬이 됩니다. 중첩 for 루프를 통해 행렬 A의 열과 행렬 B의 행을 순회하면서 해당 위치의 값들을 곱한 후 모두 더하는 방식으로 결과를 계산합니다.

예제

# 2개의 행을 가진 행렬 A
A = ([5,10,15],[20,25,30])

# 2개의 열을 가진 행렬 B
B = ([4,8],[12,10],[14,16])

result = [[0 for x in range(2)] for y in range(2)]

for i in range(len(A)):
   # 행렬 A의 열 순회
   for j in range(len(B[0])):
      # 행렬 B의 행 순회
      for k in range(len(B)):
         result[i][j] += A[i][k] * B[k][j]
for r in result:
    print(r)

출력

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:

[350, 380]
[800, 890]

NumPy 사용하기

NumPy에는 행렬 곱셈을 수행하는 dot이라는 내장 함수가 있습니다. 이 함수를 활용하면 코드 줄 수가 크게 줄어들고 문법도 매우 간단해집니다.

예제

import numpy as np

# 행렬 A
matrix_A = ([5,10,15],[20,25,30])

# 행렬 B
matrix_B = ([4,8],[12,10],[14,16])
result = np.dot(matrix_A,matrix_B)

# 결과 출력
print(result)

출력

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:

[[350 380]
[800 890]]

추가 팁: @ 연산자 활용

파이썬 3.5 이상 버전에서는 @ 연산자를 사용해 matrix_A @ matrix_B처럼 더 직관적으로 행렬 곱셈을 표현할 수도 있습니다. np.matmul() 함수 역시 동일한 기능을 제공하므로, 상황에 맞게 선택하여 사용하면 됩니다. 대규모 데이터를 다루는 경우 NumPy의 벡터화된 연산이 일반 for 루프보다 훨씬 빠른 성능을 보여주므로 실무에서는 NumPy 방식을 권장합니다.