본문 바로가기
프로그래밍/파이썬

넘파이(numpy)에서 행렬 연산

by 깊은대학 2021. 3. 12.

행렬의 덧셈과 뺄셈은 행렬의 구성 성분(element) 단위의 계산이다.

 

 

덧셈과 뺄셈에서는 기본적으로 두 행렬의 행과 열의 크기가 같아야 한다. 예를 들어 행렬 AB의 덧셈과 뺄셈은 다음과 같다.

 

A=[123456],   B=[789101112]C=A+B=[81012141618]D=AB=[666666]

 

import numpy as np

A = np.array([[1,2,3], [4,5,6]])
B = np.array([[7,8,9], [10,11,12]])

C = A+B
D = A-B

print("C=", C, "\nD=", D)

 

그러면 A+3 은? 행렬과 스칼라값과의 덧셈이다. 행렬의 모든 성분에 3을 더하라는 얘기다. 뺄셈도 마찬가지다.

 

A+3=[456789]

 

print("A+3=", A+3)

 

그렇다면, 다음 덧셈은 가능할까?

 

A=[123456],   E=[12]

 

일 때, A+E 는? 두 행렬의 행과 열의 길이가 다르므로 오류가 나야 맞지만 넘파이에서는 다음과 같이 행렬 E를 행렬 A의 열의 길이에 맞춰 늘려서 계산한다.

 

 

E = np.array([[1],[2]])
print("A+E=", A+E)

 

이와 같이 부족한 행과 열을 같은 성분으로 채워서 계산하는 방법을 브로드캐스팅(broadcasting)이라고 한다. 매트랩에서도 동일한 방법을 사용한다.

매트랩에서는 행렬의 곱셈이 기본적으로 행렬 단위로 계산되는 것에 비해, 넘파이에서는 행렬의 성분 단위로 계산된다.

 

A=[123456],   B=[789101112]AB=[71627405572]

 

print("A*B=", A*B)

 

행렬의 성분 단위 곱셈에도 브로드캐스팅이 적용된다.

행렬 곱셈을 하려면 행렬 A의 열과 행렬 B의 행의 길이가 같아야 한다. 넘파이에서 행렬 곱셈은 ndarray.dot 을 사용한다.

 

ABT=[5068122167]

 

G = A.dot(B.T)
print("AB^T=", G)

 

행렬의 모든 성분의 총합은 ndarray.sum() 을 사용한다.

 

print("A=", A, "\nA.sum=", A.sum())

 

행렬의 행 단위의 합은 ndarray.sum(axis=0), 열 단위의 합은 ndarray.sum(axis=1)을 사용한다. 행렬 A의 행 단위의 합은 [5 7 9]가, 열 단위의 합은 [6 15]인 1차원 어레이가 출력된다.

 

 

print(A.sum(axis=0), A.sum(axis=1))
print(A.sum(axis=0).shape, A.sum(axis=1).shape)

 

행렬의 모든 성분의 평균은 ndarray.mean() 을 사용한다. 행렬의 행 단위의 평균은 ndarray.mean(axis=0), 열 단위의 평균은 ndarray.mean(axis=1) 을 사용한다.

 

print(A.mean(), A.mean(axis=0), A.mean(axis=1))

 

행렬의 모든 성분의 최대값은 ndarray.max() 을 사용한다. 행렬의 행 단위의 최대값은 ndarray.max(axis=0), 열 단위의 최대값은 ndarray.max(axis=1) 을 사용한다.

 

print(A.max(), A.max(axis=0), A.max(axis=1))

 

최소값은 max 대신에 min 을 사용하면 된다.

 

 

 

댓글