numpy 배열의 연산
NumPy 배열은 파이썬 리스트와 비슷해 보이지만, 연산 방식이 완전히 다르다.
파이썬 리스트는 데이터를 단순히 저장하는 용도에 가깝지만, NumPy 배열은 수학 연산을 효율적으로 수행하도록 설계되어 있다.
특히 NumPy 배열끼리는 원소(element) 단위 연산이 가능하다는 점이 가장 중요하다.
예제를 보자.
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = a + b
print(c)
출력 결과는 다음과 같다.
[5 7 9]
파이썬 리스트에서 +는 두 리스트를 이어붙이는 역할을 한다.
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
위 코드는 `[1, 2, 3, 4, 5, 6]`처럼 리스트를 연결한다.
하지만 numpy 배열에서 +는 같은 위치의 원소끼리 더한다.
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)
이 아니라, 실제로는 아래처럼 계산되는 것이다.
[1 + 4, 2 + 5, 3 + 6]
따라서 결과는 `[5 7 9]`가 된다.
사칙연산
사칙연산도 동일한 방식으로 동작한다.
print(a - b)
print(a * b)
print(a / b)
위 코드의 출력 결과는 다음과 같다.
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4 0.5 ]
`a * b`는 실제로 `[1*4, 2*5, 3*6]`와 같이 수행된다.
즉, numpy의 기본 연산은 원소별 연산(element-wise operation)이라고 이해하면 된다.
2차원 배열의 사칙연산
2차원 배열도 동일하게 원소 단위 연산이 수행된다.
a = np.array([[1, 2, 3],
[1, 2, 3]])
b = np.array([[4, 5, 6],
[4, 5, 6]])
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(b ** 2)
출력 결과는 다음과 같다.
[[5 7 9]
[5 7 9]]
[[-3 -3 -3]
[-3 -3 -3]]
[[ 4 10 18]
[ 4 10 18]]
[[0.25 0.4 0.5 ]
[0.25 0.4 0.5 ]]
[[16 25 36]
[16 25 36]]
2차원 배열도 각 위치의 원소끼리 계산된다.
예를 들어 a + b는 실제로 아래처럼 계산된다.
[[1+4, 2+5, 3+6],
[1+4, 2+5, 3+6]]
따라서 결과는 다음과 같다.
[[5 7 9]
[5 7 9]]
a * b 역시 같은 위치의 원소끼리 곱한다.
[[1*4, 2*5, 3*6],
[1*4, 2*5, 3*6]]
그래서 결과는 다음과 같다.
[[ 4 10 18]
[ 4 10 18]]
즉, numpy의 기본 사칙연산은 모두 원소별 연산(element-wise operation)이라고 이해하면 된다.
원소별 곱과 행렬곱
여기서 중요한 점은 `*`가 행렬곱이 아니라는 것이다.
numpy 에서 `*`와 `@`는 다음과 같다.
- * → 원소별 곱(element-wise multiplication)
- @ → 행렬곱(matrix multiplication)
아래와 같은 예제가 있을 때,
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[5, 6]])
print(a * b)
print(a @ b)
출력은 다음과 같다.
[[ 5 12]
[15 24]]
[[15 18]
[35 42]]
1. 원소별 곱 (*)
a * b는 같은 위치의 값끼리 곱한다.
[[1*5, 2*6],
[3*5, 4*6]]
따라서 결과는 다음과 같다.
[[ 5 12]
[15 24]]
2. 행렬곱 (@)
반면 a @ b는 행렬곱이다.
행렬곱은 “행(row)”과 “열(column)”을 곱해서 계산한다.
첫 번째 행과 첫 번째 열:
1*5 + 2*5 = 15
첫 번째 행과 두 번째 열:
1*6 + 2*6 = 18
두 번째 행과 첫 번째 열:
3*5 + 4*5 = 35
두 번째 행과 두 번째 열:
3*6 + 4*6 = 42
따라서 최종 결과는 다음과 같다.
[[15 18]
[35 42]]
딥러닝에서는 입력 데이터와 가중치(weight)를 계산할 때 행렬곱이 매우 자주 사용된다.
'STUDY > ML DL' 카테고리의 다른 글
| NumPy 기초 함수 정리: 수학 연산, 통계, axis (0) | 2026.05.08 |
|---|---|
| numpy : 배열 인덱싱과 슬라이싱, boolean 인덱싱 (0) | 2026.05.08 |
| numpy : ndarray, random, randn, rand, shape, dim, size, zeros, ones, arange, linspace (1) | 2026.05.08 |
| SGD와 mini-batch SGD, Momentum과 RMSProp 기반 Adam (0) | 2026.05.08 |
| 인공신경망 이해하기 (0) | 2026.04.30 |