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()))
이 시리즈 항례입니다만, 실장은 조금 생각해 온 녀석이므로 맞고 있는 보증은 하고 있지 않습니다(웃음). 여기가 다르다든가, 이런 방법이 있다면 가르쳐주세요.
이런 느낌으로 느긋하게 읽고 진행하고 있습니다.
실수나 질문, 의견 등 있으면 부담없이 코멘트해 주세요. 열심히 대답하니까(웃음).
Reference
이 문제에 관하여(Python 수학 시리즈 ② 행렬의 곱셈), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Hiroaki-K4/items/036f8a25904284cfa71b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)