달나라 노트

Python numpy : 행렬 연산 (+, -, *, /, @, 행렬의 곱) 본문

Python/Python numpy

Python numpy : 행렬 연산 (+, -, *, /, @, 행렬의 곱)

CosmosProject 2022. 3. 13. 01:24
728x90
반응형

 

 

 

numpy에서 행렬을 만들고 행렬끼리의 연산을 하는 방법을 알아보겠습니다.

 

 

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3],
        [4, 5]
    ]
)

arr_new = arr_1 + arr_2

print(arr_new)


-- Result
[[3 5]
 [7 9]]

위 예시는 2행 2열의 행렬을 2개 만들고 더한 결과입니다.

 

행렬의 합은 위처럼 동일한 위치에 있는 요소를 서로 더하는 것입니다.

 

그렇기에 아래처럼 행렬의 모양 (행, 열의 개수)이 다르면 에러가 발생합니다.

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3, 4],
        [4, 5, 6]
    ]
)

arr_new = arr_1 + arr_2

print(arr_new)


-- Result
ValueError: operands could not be broadcast together with shapes (2,2) (2,3)

 

 

 

 

행렬의 빼기 연산입니다.

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3],
        [4, 5]
    ]
)

arr_new = arr_1 - arr_2

print(arr_new)


-- Result
[[-1 -1]
 [-1 -1]]

 

 

 

행렬의 나누기 연산입니다.

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3],
        [4, 5]
    ]
)

arr_new = arr_1 / arr_2

print(arr_new)


-- Result
[[0.5        0.66666667]
 [0.75       0.8       ]]

 

 

 

 

행렬의 곱하기 연산입니다.

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3],
        [4, 5]
    ]
)

arr_new = arr_1 * arr_2

print(arr_new)


-- Result
[[ 2  6]
 [12 20]]

 

 

여기까지해서 기본적인 행렬의 사칙연산을 알아보았습니다.

 

 

 

 

 

 

 

 

 

하지만 행렬에서는 한 가지 더 중요한 연산이 있습니다.

바로 행렬의 곱 입니다.

 

위에서 행렬에 * 기호를 이용해 곱셈을 해보았는데 이것과는 다른 곱셈입니다.

 

https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88

행렬의 곱셈에 대한 내용은 위 링크에 잘 정리되어 있습니다.

 

행렬의 곱은 @ 기호를 이용하면 가능합니다.

 

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3],
        [4, 5]
    ]
)

arr_new = arr_1 @ arr_2

print(arr_new)


-- Result
[[10 13]
 [22 29]]

 

 

 

 

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3, 4],
        [4, 5, 6]
    ]
)

arr_new = arr_1 @ arr_2

print(arr_new)


-- Result
[[10 13 16]
 [22 29 36]]

행렬의 곱은 일반적인 행렬 내 요소들끼리의 1:1 연산과는 좀 다르기 때문에 위처럼 행렬의 모양이 달라도 가능합니다.

 

다만 마냥 모든게 가능한 것이 아니라 다음과 같은 조건만 만족하면 됩니다.

왼쪽 행렬의 열 개수와 오른쪽 행렬의 행 개수가 동일할 것.

 

그래서 위 예시를 다시 보면

 

왼쪽 행렬 = 2행 2열

오른쪽 행렬 = 2행 3열

왼쪽 행렬의 열 개수는 2개, 오른쪽 행렬의 행 개수는 2개이므로 행렬의 곱 연산이 가능합니다.

 

import numpy as np

arr_1 = np.array(
    [
        [1, 2],
        [3, 4]
    ]
)

arr_2 = np.array(
    [
        [2, 3, 4],
        [4, 5, 6],
        [6, 7, 8],
    ]
)

arr_new = arr_1 @ arr_2

print(arr_new)


-- Result
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 2)

위 예시를 보면

왼쪽 행렬의 열 개수가 2개, 오른쪽 행렬의 행 개수가 3개로 다르기 때문에 error가 발생합니다.

 

 

 

 

import numpy as np

arr_1 = np.array(
    [
        [1, 2, 3],
        [3, 4, 5]
    ]
)

arr_2 = np.array(
    [
        [2, 3, 4],
        [4, 5, 6],
        [6, 7, 8],
    ]
)

arr_new = arr_1 @ arr_2

print(arr_new)


-- Result
[[28 34 40]
 [52 64 76]]

다른 예시입니다.

 

지금까지 행렬의 곱 연산에 대한 결과를 보면

행렬의 곱 연산을 한 결과는 왼쪽 행렬의 행 개수와 오른쪽 행렬의 열 개수가 됩니다.

 

왼쪽 행렬 = 2행 3열

오른쪽 행렬 = 3행 3열

(왼쪽 행렬의 

 

결과 행렬 = 2행 3열

 

 

 

 

 

import numpy as np

arr_1 = np.array(
    [
        [1, 2, 3]
    ]
)

arr_2 = np.array(
    [
        [2, 3, 4],
        [4, 5, 6],
        [6, 7, 8],
    ]
)

arr_new = arr_1 @ arr_2

print(arr_new)


-- Result
[[28 34 40]]

왼쪽 행렬 = 1행 3열

오른쪽 행렬 = 3행 3열

(왼쪽 행렬의 

 

결과 행렬 = 1행 3열

 

 

 

 

 

 

728x90
반응형
Comments