Programmers Coding Quiz #30 행렬의 곱셈
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한사항
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
입출력 예
arr1 | arr2 | return |
---|---|---|
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] | [[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[22, 22, 11], [36, 28, 18], [29, 20, 14]] |
풀이
import numpy as np
def solution(arr1, arr2):
result = np.mat(arr1) * np.mat(arr2)
return result.tolist()
- np.array로 반환된 값을 그대로 곱셈하면 일반적인 행렬연산이 아니라 단순히 리스트 간 위상이 같은 요소들끼리만 곱합니다 예컨데 [[2,2],[3,3]] 과 [[1,2],[3,1]]의 결과값은 [[2,4],[9,3]]이 됩니다. 실제 행렬곱의 결과인 [[8,6],[12,9]]과는 다른 결과가 나오죠
- np.matrix(=np.mat)으로 변환한 matrix인자는 곱셈연산을 하면 원하는 결과값이 나옵니다.
- 반환된 결과값을 tolist()라는 numpy메서드로 변경해주면 리스트 형태로 반환됩니다.
다른풀이
def productMatrix(A, B):
return [[sum(a*b for a, b in zip(A_row,B_col)) for B_col in zip(*B)] for A_row in A]
zip()은 보통 for문과 함께 같은 길이의 리스트를 순회할 때 많이씁니다. 하지만 여기서는 zip()특성을 활용해 B의 열을 구해낼 수 있습니다.
만약 arr1이 [[1, 4], [3, 2], [4, 1]]
일 때 zip(*arr1)을 쓰면 리스트 세 개의 같은 인덱스에 있는 요소끼리 묶이게 됩니다. 그러므로 [(1,3,4),(4,2,1)]이 됩니다. 이런식으로 zip을 활용해 행렬곱연산을 구현할 수 있습니다. numpy같은 치트키를 쓰지않아도 내장 함수로 1줄코딩을 할 수 있는 멋진 풀이였습니다.
Author And Source
이 문제에 관하여(Programmers Coding Quiz #30 행렬의 곱셈), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@keywookim/Programmers-Coding-Quiz-30-행렬의-곱셈저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)