Python 수학 시리즈 ② 행렬의 곱셈

경위



심층 학습 책 을 읽고 진행하고 있습니다만, 오로지 문자를 읽으면 졸려 버리므로, 나온 항목을 파이썬으로 구현하면서 이해를 깊게 해 나가려고 생각합니다. 수요가 있을지는 모르겠지만, 시리즈화하고 있습니다(웃음). 목차는 여기입니다. 이번에는 행렬의 곱셈을 해 나가려고 생각합니다. 파이썬은 라이브러리가 풍부하기 때문에, 그것에 의지하면 아무것도 생각하지 않고 계산할 수 있습니다만, 굳이 자작하고 있습니다.
이것은 advent calendar의 마지막 기사입니다. 캘린더의 끝은 @bigface00 씨가 조입니다.

행렬의 곱셈



행렬의 곱셈은 아래와 같은 이미지로 계산할 수 있습니다. 추천 소스


간단한 구현



여기 기사를 참고하면 numpy.dot 또는 numpy.matmal을 사용하면 쉽게 구현할 수 있습니다.
arr1 = np.arange(4).reshape((2, 2))
print(arr1)
# [[0 1]
#  [2 3]]

arr2 = np.arange(6).reshape((2, 3))
print(arr2)
# [[0 1 2]
#  [3 4 5]]

print(np.dot(arr1, arr2))
# [[ 3  4  5]
#  [ 9 14 19]]

print(arr1.dot(arr2))
# [[ 3  4  5]
#  [ 9 14 19]]

print(np.matmul(arr1, arr2))
# [[ 3  4  5]
#  [ 9 14 19]]

직접 만들어 보았습니다.



우선은 최종적인 대답의 행수와 열수를 세어 둡니다. 대답의 행 수는 이전 행렬의 행 수이고 대답의 열 수는 나중 행렬의 열 수이므로 for 문을 돌립니다. 세 번째 for 문에서 이전 행렬의 행과 다음 행렬의 열을 계산합니다. 이전 행렬의 각 열의 계산 결과를 tmp_list에 넣어두고 결국 ans_list에 모든 계산 결과를 넣습니다.
def matrix_mlp(list1, list2):
    ans_row = len(list1)
    ans_col = len(list2[0])
    ans_list = []
    for i in range(ans_row):
        tmp_list = []
        for j in range(ans_col):
            tmp = 0
            for k in range(ans_row):
                tmp += list1[i][k] * list2[k][j]
            tmp_list.append(tmp)
        ans_list.append(tmp_list)
    return ans_list

def main():
    print("~~matrix_multiple_test~~")
    arr1 = np.arange(4).reshape((2, 2))
    arr2 = np.arange(6).reshape((2, 3))
    print("Before1  :", arr1.tolist())
    print("Before2  :", arr2.tolist())
    print("correct  :", np.dot(arr1, arr2).tolist())
    print("my_answer:", matrix_mlp(arr1.tolist(), arr2.tolist()))

이 시리즈 항례입니다만, 실장은 조금 생각해 온 녀석이므로 맞고 있는 보증은 하고 있지 않습니다(웃음). 여기가 다르다든가, 이런 방법이 있다면 가르쳐주세요.
이런 느낌으로 느긋하게 읽고 진행하고 있습니다.

실수나 질문, 의견 등 있으면 부담없이 코멘트해 주세요. 열심히 대답하니까(웃음).

좋은 웹페이지 즐겨찾기