numpy 여러 가지 곱셈의 연산

hyowon·2023년 9월 15일

Math

목록 보기
1/1
post-thumbnail

Numpy란?

Numpy는 행렬 (array)을 다루는 패키지답게, 지원하는 곱셈의 종류가 너무나 많다.

이런 3 * 3 행렬 두 개가 있다고 하자.

@과 np.dot()

dot: 
 [[22 22 11]
 [36 28 18]
 [29 20 14]]
 
at: 
 [[22 22 11]
 [36 28 18]
 [29 20 14]]

우선 이 두 연산은 같은 연산이다. 흔히 행렬의 곱셈이라고 하면 (행렬의 내적, 앞 행렬의 row를 가져오고 뒷 행렬에서는 column을 가져오는...) 가장 일반적으로 떠올릴 수 있는 곱셈이다. Numpy 패키지를 사용하지 못하고 행렬 곱셈을 계산하는 문제에서 column을 전치행렬화해서 각각을 곱해줘서 더해주는 방법으로 했다.

np.inner()

inner: 
 [[28 18 11]
 [40 20 18]
 [31 14 14]]

np.inner도 사실은 내적을 계산하는 함수이다. np.dot과 np.inner 함수 모두 두 벡터의 내적을 계산하는 데 사용되지만, 다차원 행렬에 대해서는 np.dot과 다르게 작동한다. 이에 대한 이유는 내적의 정의와 수학적인 의미에 있다.

np.dot()과의 차이점

np.dot 함수는 배열의 모든 차원에서 내적을 수행한다. 따라서 다차원 행렬에서도 각 요소끼리 내적을 계산하게 된다. (여기서 내적의 결과도 행렬의 모든 요소를 고려한 하나의 스칼라 값이 되지만, 한 row와 column간의 내적이다) 따라서 np.dot 함수는 두 행렬 간의 곱셈이다.

np.inner 함수는 반면에 두 벡터 간의 내적을 계산하는 함수라서, 다차원 행렬에서는 내적을 계산하기 위해 벡터의 요소를 평탄화하여 벡터로 다룬다. 내적의 결과는 다차원 행렬이 아니라 스칼라 값이 된다.

따라서 np.dot 함수는 다차원 행렬 간의 행렬 곱셈에 사용되고 결과는 다차원 행렬이 되며, np.inner 함수는 다차원 행렬에서 내적을 계산하고 결과는 스칼라 값이 된다.

np.outer()

outer: 
 [[10  8  6  4  8  2  6  2  2]
 [15 12  9  6 12  3  9  3  3]
 [10  8  6  4  8  2  6  2  2]
 [20 16 12  8 16  4 12  4  4]
 [10  8  6  4  8  2  6  2  2]
 [20 16 12  8 16  4 12  4  4]
 [15 12  9  6 12  3  9  3  3]
 [ 5  4  3  2  4  1  3  1  1]
 [20 16 12  8 16  4 12  4  4]]

np.outer()는 행렬 간의 outer product를 계산하는 함수이다. 사실 이건 우리가 흔히 고등학교에서 배우는 '외적'이라고 하는 cross product와는 다른 개념이다.

번외: np.cross() vs. np.outer()

cross product를 연산하는 np.cross()는 dot product와 비슷하게 벡터 간의 연산이다. 그러나 dot product는 스칼라값이 결과지만, cross product는 벡터값이 결과이다.

그러나 outer product는 벡터의 텐서곱을 의미한다. (그래서 사실 내가 들고 온 예제는 벡터가 아니라 행렬이라 좀 적절치 않다 ㅎㅎ..)

이렇게 뒷 행렬이 전치행렬이 되어서 모든 행과 열의 조합을 곱한 것이 outer product이다. np.outer()로 계산할 수 있다.

개념이 많지만 이번 기회에 정리하게 되어 좋네

profile
인생을 즐겁게

0개의 댓글