Numpy 사칙연산, Transform, 브로드캐스팅

파이썬/Numpy|2019.08.08 09:16

넘파이는 사칙연산 +, -, *, / 를 사용하여 두 배열의 요소들간의 사칙연산을 할 수 있음

 

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[2, 3, 4], [5, 6, 7]])
arr1 + arr2
array([[ 3,  5,  7],
       [ 9, 11, 13]])

arr2 - arr1
array([[1, 1, 1],
       [1, 1, 1]])

arr1 * arr2
array([[ 2,  6, 12],
       [20, 30, 42]])

arr2 / arr1
array([[2.        , 1.5       , 1.33333333],
       [1.25      , 1.2       , 1.16666667]])

같은 위치의 요소와 연산하므로 두 배열의 shape는 같아야 연산할 수 있고

shape가 다르면 valueerror가 뜬다.


arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2],[3, 4]])
arr1+arr2
ValueError: operands could not be broadcast together with shapes (2,3) (2,2) 

 

arr1.dot(arr2)을 사용하면 일반적인 행렬곱 연산

arr2.dot(arr1)
array([[ 9, 12, 15],
       [19, 26, 33]])

첫번째 배열의 열과 두번째 배열의 행의 shape가 같아야 dot 연산 가능

shape가 (a,b)와(c,d) 일때 b와 c가 같아야 dot 행렬곱이 가능하고

연산후 반환되는 행렬의 shape는 (a, d)이다.

shape가 맞지 않으면 valueerror를 띄운다.


arr1.dot(arr2)
ValueError: shapes (2,3) and (2,2) not aligned: 3 (dim 1) != 2 (dim 0)

arr.T 행과열을 서로 바꾸는 shape의 변환 transform

arr
array([[1, 2, 3],
       [4, 5, 6]])

arr.shape
(2, 3)

arr.T
array([[1, 4],
       [2, 5],
       [3, 6]])

arr1.T.shape
(3, 2)

 

브로드캐스팅

shape이 다른 배열 간 연산이 안되지만 특정 shape일 때는 가능함.

shape이 다른 배열 간 연산을 지원하는 기능을 브로드캐스팅이라 함.

상수(스칼라값)을 연산하면 각 요소에 상수값이 연산된다.

arr1
array([[1, 2, 3],
       [4, 5, 6]])

arr1 + 3
array([[4, 5, 6],
       [7, 8, 9]])

arr1 * 3
array([[ 3,  6,  9],
       [12, 15, 18]])

 

arr1 = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])
arr2 = np.array([1,2,3])
arr1+arr2
array([[2, 3, 4],
       [3, 4, 5],
       [4, 5, 6],
       [5, 6, 7]])

arr1의 [1, 1, 1]과 arr2의 [1, 2, 3]이 연산되어 [2, 3, 4]를 반환

arr1의 [2, 2, 2]과 arr2의 [1, 2, 3]이 연산되어 [3, 4, 5]를 반환

arr1의 [3, 3, 3], [4, 4, 4]도 마찬가지로 연산되어 위와 같은 배열을 반환

 

arr1 = np.array([[1],[2],[3],[4]])
arr2 = np.array([1,2,3])
arr1 + arr2
array([[2, 3, 4],
       [3, 4, 5],
       [4, 5, 6],
       [5, 6, 7]])

이러한 형태도 가능하나 난 멍청하니까 못쓰겠다.

댓글()