arr1 = np.array([[1, 3, 4], [4, 2, 6]])
arr2 = np.array([[10, 11, 12], [15, 17, 19]])
arr1 + arr2
- 출력
array([[11, 14, 16],
[19, 19, 25]])
arr1 - arr2
- 출력
array([[ -9, -8, -8],
[-11, -15, -13]])
arr1 * arr2
- 출력
array([[ 10, 33, 48],
[ 60, 34, 114]])
arr1 / arr2
- 출력
array([[0.1 , 0.27272727, 0.33333333],
[0.26666667, 0.11764706, 0.31578947]])
합 연산
arr1 + 2
- 출력
array([[3, 5, 6],
[6, 4, 8]])
차 연산
arr1 - 10
- 출력
array([[-9, -7, -6],
[-6, -8, -4]])
곱 연산
arr1 * 2
- 출력
array([[ 2, 6, 8],
[ 8, 4, 12]])
나눗셈 연산
arr1 / 10
- 출력
array([[0.1, 0.3, 0.4],
[0.4, 0.2, 0.6]])
True / Falsearr1 > 4
- 출력
array([[False, False, False],
[False, False, True]])
arr1 = np.array([[1, 3, 4],
[4, 2, 6]])
arr3 = np.array([10, 20, 30])
(2, 3) / (3, ) 으로 다르지만 아래와 같이 연산이 가능하다.arr1 + arr3
- 출력
array([[11, 23, 34],
[14, 22, 36]])
arr3 이 크기가 (2, 3) 인 것처럼 변환되어 연산이 수행되었다.ndim 이 동일하지만 차원의 크기가 다른 경우 연산이 불가능하다.arr1 = np.array([[1, 3, 4],
[4, 2, 6]])
arr4 = np.array([[1], [2], [3]])
(2, 3) / (3, 1) 으로 차원의 수는 동일하지만 차원의 크기가 달라 아래와 같은 에러가 발생한다.arr1 + arr4
- 출력
ValueError: operands could not be broadcast together with shapes (2,3) (3,1)
브로드캐스팅 조건
1 이거나Ex) (2, 3) 과 (3, 1) 의 경우 뒤에서부터 3 과 1은 1이 있어 가능하나, 2 와 3은 둘 중 하나가 1도 아니고 축의 길이가 같지도 않기 때문에 연산이 불가능한 것이다.
arr1 = np.arange(1, 10)
arr2 = np.array([[10, 11, 12],
[15, 17, 19]])
arr1.sum()
- 출력
np.int64(45)
arr2.sum()
- 출력
np.int64(84)
axis : 연산을 진행할 기준 축을 설정한다.0 : 열을 기준으로 연산을 진행하며, 행방향 (세로) 계산한다.1 : 행을 기준으로 연산을 진행하며, 열방향 (가로) 계산한다.0 : 면을 기준으로 연산을 진행하며, 각 면의 동일한 위치의 요소끼리 계산한다.1 : 열을 기준으로 연산을 진행하며, 행방향 (세로) 계산한다.2 : 행을 기준으로 연산을 진행하며, 열방향 (가로) 계산한다.2차원 열 기준
arr2 = np.array([[10, 11, 12],
[15, 17, 19]])
arr2.sum(axis=0)
- 출력
array([25, 28, 31])
2차원 행 기준
arr2.sum(axis=1)
- 출력
array([33, 51])
3차원 배열
arr3 = np.arange(1, 13).reshape(2, 3, 2)
arr3
- 출력
array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[ 7, 8],
[ 9, 10],
[11, 12]]])
3차원 면 기준
arr3.sum(axis=0)
- 출력
array([[ 8, 10],
[12, 14],
[16, 18]])
3차원 열 기준
arr3.sum(axis=1)
- 출력
array([[ 9, 12],
[27, 30]])
3차원 행 기준
arr3.sum(axis=2)
- 출력
array([[ 3, 7, 11],
[15, 19, 23]])
arr1.mean()
- 출력
np.float64(5.0)
열 기준
arr2 = np.array([[10, 11, 12],
[15, 17, 19]])
arr2.mean(axis=0)
- 출력
array([12.5, 14. , 15.5])
행 기준
arr2.mean(axis=1)
- 출력
array([11., 17.])
arr1.std()
- 출력
np.float64(2.581988897471611)
arr1.var()
- 출력
np.float64(6.666666666666667)
arr1.min()
- 출력
np.int64(1)
arr1.max()
- 출력
np.int64(9)
arr1.cumsum()
- 출력
array([ 1, 3, 6, 10, 15, 21, 28, 36, 45])
3차원 면 기준
arr3 = np.array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[ 7, 8],
[ 9, 10],
[11, 12]]])
arr3.cumsum(axis=0)
- 출력
array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[ 8, 10],
[12, 14],
[16, 18]]])
3차원 열 기준
arr3.cumsum(axis=1)
- 출력
array([[[ 1, 2],
[ 4, 6],
[ 9, 12]],
[[ 7, 8],
[16, 18],
[27, 30]]])
arr2 = np.array([[10, 11, 12],
[15, 17, 19]])
arr2.cumprod(axis=1)
- 출력
array([[ 10, 110, 1320],
[ 15, 255, 4845]])
선형 대수(Linear algebra)를 위한 행렬(2차원 배열) 연산
행렬 곱, 전치 행렬, 역행렬, 행렬식 등
A.dot(B) 혹은 np.dot(A,B)A.transpose() 혹은 np.transpose(A)np.linalg.inv(A)np.linalg.det(A)예시 행렬
A = np.array([0, 1, 3, 5, 9, 2]).reshape(2, 3)
B = np.array([3, 2, 0, -10, 11, 4, 2, 7, 5]).reshape(3, 3)
C = np.array([5, 1, 5, 7, 0, -1]).reshape(3, 2)
# A
array([[0, 1, 3],
[5, 9, 2]])
# B
array([[ 3, 2, 0],
[-10, 11, 4],
[ 2, 7, 5]])
# C
array([[ 5, 1],
[ 5, 7],
[ 0, -1]])
(a x b) 행렬과 (c x d) 행렬의 곱은 b = c 여야 하며, 곱의 결과는 (a x d) 행렬이다.각 행렬의 크기 확인
A.shape, B.shape, C.shape
- 출력
((2, 3), (3, 3), (3, 2))
행렬의 곱1
A.dot(B)
- 출력
array([[ -4, 32, 19],
[-71, 123, 46]])
행렬의 곱 (불가능)
(3 x 3) 행렬이고, A 행렬은 (2 x 3) 행렬이라 2 ≠ 3 이므로 에러 발생한다.B.dot(A)
- 출력
ValueError: shapes (3,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)
행렬의 곱2
np.dot(A, B)
- 출력
array([[ -4, 32, 19],
[-71, 123, 46]])
# A
array([[0, 1, 3],
[5, 9, 2]])
# A.transpose()
array([[0, 5],
[1, 9],
[3, 2]])
# A.T
array([[0, 5],
[1, 9],
[3, 2]])
# np.transpose(A)
array([[0, 5],
[1, 9],
[3, 2]])
예시 행렬
D = np.array([1, 2, -10, 4]).reshape(2, 2)
D
- 출력
array([[ 1, 2],
[-10, 4]])
역행렬 연산
D_inv = np.linalg.inv(D)
D_inv
- 출력
array([[ 0.16666667, -0.08333333],
[ 0.41666667, 0.04166667]])
np.dot(D, D_inv)
- 출력
array([[ 1.00000000e+00, 1.38777878e-17],
[-2.22044605e-16, 1.00000000e+00]])
np.linalg.det(D)
- 출력
np.float64(24.000000000000004)