학습 목표
이번 주는 코딩 실습보다 수학적 배경 이해가 목표입니다. 이 장을 마치면 다음을 설명할 수 있어야 합니다.
- 점, 벡터, 행렬을 구분한다.
- 벡터 덧셈을 성분별 계산과 화살표 그림으로 설명한다.
- 스칼라배가 벡터의 길이와 방향을 어떻게 바꾸는지 설명한다.
- 행렬을 행(row), 열(column), 원소, 크기(
m × n)로 읽는다. - 행렬 덧셈과 스칼라배가 같은 위치의 칸끼리 계산되는 이유를 설명한다.
- 행렬-벡터 곱을 “행마다 하나의 가중합을 만드는 계산”으로 설명한다.
- 행렬-행렬 곱이 가능한 조건과 결과 크기를 판단한다.
- NumPy에서
shape,axis,*,@를 배울 때 어떤 수학 개념과 연결되는지 말한다.
왜 NumPy 전에 행렬과 벡터를 배우나요?
Python 리스트에 숫자를 넣는 것만으로도 간단한 계산은 할 수 있습니다. 하지만 공학 데이터는 금방 다음처럼 커집니다.
| 데이터 상황 | 수학적으로 보는 모양 | NumPy에서 만날 모양 |
|---|---|---|
| 전압값 하나 | 스칼라 | 3.3 |
| 전압을 5번 측정 | 벡터 | shape == (5,) |
| 3개 센서를 4번 측정 | 행렬 | shape == (4, 3) |
| 이미지 한 장 | 여러 축을 가진 배열 | height × width × color |
즉, NumPy는 단순히 “빠른 리스트”가 아닙니다. 벡터와 행렬의 계산 규칙을 코드로 옮긴 도구입니다.
0. 기본 용어 정리
처음 보는 용어가 많다면, 이번 주에는 아래 뜻으로 먼저 정리하세요.
| 용어 | 쉬운 설명 | 예 |
|---|---|---|
| 스칼라(scalar) | 숫자 하나 | 3, -1.5, 0.2 |
| 벡터(vector) | 숫자 성분을 가진 화살표 또는 이동량 | [2, 3] |
| 성분(component) | 벡터 안의 각 숫자 | [2, 3]의 2, 3 |
| 행렬(matrix) | 행과 열을 가진 숫자표 | [[1, 2], [3, 4]] |
| 행(row) | 가로줄 | 첫 번째 행 [1, 2] |
| 열(column) | 세로줄 | 첫 번째 열 [1, 3] |
| 원소 | 행렬의 한 칸 | 1행 2열의 값 2 |
| shape | 데이터의 모양 | (2, 3) |
| axis | 어느 방향으로 모을지 나타내는 축 | axis=0, axis=1 |
1. 점과 벡터: 같은 숫자쌍도 다르게 읽을 수 있습니다
좌표평면에서 (2, 3)은 보통 점의 위치를 뜻합니다. 하지만 벡터로 읽으면 뜻이 조금 달라집니다.
| 표현 | 읽는 법 |
|---|---|
점 (2, 3) | x=2, y=3인 위치 |
벡터 [2, 3] | 오른쪽으로 2, 위로 3 이동하는 화살표 |
벡터를 성분으로 읽기
v = [2, 3]
첫 번째 성분 2 → x 방향으로 2칸두 번째 성분 3 → y 방향으로 3칸벡터를 처음 배울 때는 “화살표”와 “숫자 묶음”을 번갈아 떠올리세요.
- 그림으로 보면: 이동 화살표
- 계산으로 보면: 같은 위치 성분끼리 계산하는 숫자 묶음
2. 벡터 덧셈: 두 번 움직이면 한 번의 움직임이 됩니다
두 벡터를 더한다는 것은 두 이동을 이어 붙인다는 뜻입니다.
u = [2, 1]v = [1, 3]
u + v = [2 + 1, 1 + 3] = [3, 4]성분별로 보면 x 방향 이동량끼리 더하고, y 방향 이동량끼리 더합니다.
읽기 체크
u = [2, 1]은 오른쪽으로 몇 칸, 위로 몇 칸 움직이나요?v = [1, 3]을u의 끝에 붙이면 마지막 도착점은 어디인가요?u + v와v + u의 결과 성분은 같은가요?
3. 스칼라배: 같은 방향으로 늘리거나 반대로 뒤집기
벡터 덧셈이 “이동을 이어 붙이는 계산”이었다면, 스칼라배는 “같은 이동을 몇 배로 키우거나 줄이는 계산”입니다.
스칼라는 방향이 없는 숫자입니다. 벡터에 스칼라를 곱하면 각 성분에 같은 숫자를 곱합니다.
v = [2, 1]
2v = [4, 2]0.5v = [1, 0.5]-v = [-2, -1]스칼라 k | 벡터 kv의 변화 |
|---|---|
k > 1 | 같은 방향으로 길어짐 |
0 < k < 1 | 같은 방향으로 짧아짐 |
k = 0 | [0, 0]이 됨 |
k < 0 | 반대 방향으로 뒤집힘 |
읽기 체크
3[1, 2]의 결과는 무엇인가요?-1[1, 2]는 원래 벡터와 같은 방향인가요, 반대 방향인가요?0[1, 2]는 어떤 벡터가 되나요?
4. 가중합과 내적: 같은 위치끼리 곱해 모두 더하기
이제 “성분별로 더하기”에서 한 단계 더 나아가, 성분마다 다른 중요도를 주는 계산을 보겠습니다.
행렬-벡터 곱을 배우기 전에 **가중합(weighted sum)**을 먼저 봅니다. 가중합은 “각 값에 중요도 또는 계수를 곱한 뒤 더하는 계산”입니다.
예를 들어 최종 점수를 이렇게 계산한다고 합시다.
최종점수 = 0.4 × 과제점수 + 0.6 × 시험점수과제점수가 80점, 시험점수가 90점이면 다음과 같습니다.
0.4 × 80 + 0.6 × 90 = 32 + 54 = 86벡터로 쓰면 이렇게 볼 수 있습니다.
가중치 w = [0.4, 0.6]점수 x = [80, 90]
w · x = 0.4×80 + 0.6×90 = 86여기서 ·는 내적(dot product) 기호입니다. 두 벡터의 성분 개수가 같을 때, 같은 위치끼리 곱한 뒤 모두 더하는 계산으로 이해하면 됩니다.
5. 행렬: 숫자가 들어 있는 직사각형 표
행렬은 행과 열을 가진 숫자표입니다.
A = [ 1 2 3 ] [ 4 5 6 ]이 행렬은 가로줄이 2개, 세로줄이 3개이므로 2 × 3 행렬입니다.
| 항목 | 의미 | 위 행렬에서 예 |
|---|---|---|
| 행(row) | 가로줄 | 1행: [1, 2, 3] |
| 열(column) | 세로줄 | 2열: [2, 5] |
| 원소 | 행렬의 한 칸 | 2행 3열의 값: 6 |
| 크기 | 행 개수 × 열 개수 | 2 × 3 |
수학 인덱스와 NumPy 인덱스
수학 교과서에서는 보통 첫 번째 행, 첫 번째 열을 a11처럼 1부터 셉니다. NumPy는 Python 규칙을 따르므로 0부터 셉니다.
| 사람이 읽는 위치 | 수학식 표현 | NumPy 표현 |
|---|---|---|
| 1행 1열 | a11 | A[0, 0] |
| 1행 2열 | a12 | A[0, 1] |
| 2행 3열 | a23 | A[1, 2] |
6. 행렬 덧셈과 스칼라배: 같은 위치끼리 계산합니다
행렬 덧셈은 두 행렬의 같은 위치에 있는 값을 더합니다.
[ 1 2 ] + [ 10 20 ] = [ 11 22 ][ 3 4 ] [ 30 40 ] [ 33 44 ]중요한 조건이 있습니다. 두 행렬의 크기가 같아야 합니다.
2 × 2와2 × 2는 더할 수 있습니다.2 × 3과3 × 2는 더할 수 없습니다.
행렬 덧셈은 같은 위치의 칸끼리 더합니다. 두 행렬의 모양이 다르면 덧셈은 정의되지 않습니다.
스칼라배도 비슷합니다. 행렬의 모든 칸에 같은 숫자를 곱합니다.
3 [ 1 2 ] = [ 3 6 ] [ 3 4 ] [ 9 12 ]읽기 체크
2 × 3행렬과2 × 3행렬은 더할 수 있나요?2 × 3행렬과3 × 2행렬은 더할 수 있나요?- 행렬에
3을 곱하면 몇 개의 칸이 바뀌나요?
7. 행렬-벡터 곱: 여러 개의 가중합을 한 번에 계산합니다
앞에서 배운 내적을 행렬의 여러 행에 반복해서 적용하면 행렬-벡터 곱이 됩니다.
다음 행렬과 벡터를 봅시다.
A = [ 1 2 ] x = [ 10 ] [ 3 4 ] [ 20 ] [ 5 6 ]A는 3 × 2 행렬이고, x는 2 × 1 벡터입니다. 앞 행렬의 열 수 2와 뒤 벡터의 행 수 2가 같으므로 곱할 수 있습니다.
Ax = [ 1×10 + 2×20 ] [ 50 ] [ 3×10 + 4×20 ] = [ 110 ] [ 5×10 + 6×20 ] [ 170 ]행렬-벡터 곱은 행렬의 각 행이 벡터와 만나 결과 숫자 하나씩을 만드는 계산입니다.
조금 더 깊게 보기: 열을 섞어서 결과 만들기
처음에는 “행마다 가중합” 관점만 확실히 잡아도 됩니다. 다음 관점은 행렬곱이 왜 벡터를 바꾸는 계산인지 이해할 때 도움이 됩니다.
행렬-벡터 곱은 두 가지 방식으로 볼 수 있습니다.
| 관점 | 읽는 법 | 초심자에게 좋은 이유 |
|---|---|---|
| 행마다 내적 계산 | 각 행이 벡터와 만나 결과 하나를 만듦 | 계산 절차가 분명함 |
| 열벡터의 선형결합 | 벡터 성분만큼 행렬의 열들을 섞음 | 변환 관점으로 연결됨 |
열벡터의 선형결합으로 보면 위 계산은 다음과 같습니다.
Ax = 10 [ 1 ] + 20 [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]8. 행렬-행렬 곱: 행과 열이 만납니다
행렬-행렬 곱은 행렬 덧셈보다 조건이 더 까다롭습니다.
(m × n) @ (n × p) = (m × p)핵심은 안쪽 크기입니다.
A: 2 × 3B: 3 × 4
A @ B 가능 → 결과는 2 × 4하지만 다음은 불가능합니다.
A: 2 × 3B: 2 × 4
A @ B 불가능 → 안쪽 크기 3과 2가 다름결과의 한 칸은 어떻게 만들어지나요?
결과 행렬의 한 칸은 다음 두 줄이 만나서 만들어집니다.
- 앞 행렬의 한 행
- 뒤 행렬의 한 열
결과의 (i, j) 칸 = A의 i번째 행 · B의 j번째 열예를 들어 A가 2 × 3, B가 3 × 2이면 결과는 2 × 2입니다.
A = [ 1 2 3 ] B = [ 10 20 ] [ 4 5 6 ] [ 30 40 ] [ 50 60 ]
AB의 1행 1열 = 1×10 + 2×30 + 3×50 = 220AB의 1행 2열 = 1×20 + 2×40 + 3×60 = 280AB의 2행 1열 = 4×10 + 5×30 + 6×50 = 490AB의 2행 2열 = 4×20 + 5×40 + 6×60 = 640결과의 한 칸은 앞 행렬의 한 행과 뒤 행렬의 한 열을 같은 위치끼리 곱해 더한 값, 즉 내적입니다.
읽기 체크
2 × 3행렬과3 × 2행렬의 곱은 왜 가능한가요?- 결과 행렬은 몇 행 몇 열인가요?
- 결과의 1행 2열 칸은 앞 행렬의 어느 줄과 뒤 행렬의 어느 줄이 만나 만들어지나요?
9. 행렬을 변환으로 보기: 격자가 움직입니다
행렬은 숫자표로만 볼 수도 있지만, 벡터를 움직이는 규칙으로 볼 수도 있습니다.
예를 들어 다음 행렬을 생각해 봅시다.
A = [ 2 0 ] [ 0 1 ]이 행렬은 x 방향은 2배로 늘리고, y 방향은 그대로 둡니다.
행렬의 첫 번째 열은 기본 x 화살표가 도착하는 곳, 두 번째 열은 기본 y 화살표가 도착하는 곳으로 볼 수 있습니다.
기본 화살표 관점
좌표평면의 기본 화살표 두 개를 생각해 봅시다. 선형대수학에서는 이런 기본 화살표를 기저벡터라고도 부릅니다.
i = [1, 0] x 방향 기본 화살표j = [0, 1] y 방향 기본 화살표2×2 행렬의 두 열은 이 기본 화살표들이 어디로 이동하는지를 나타낸다고 볼 수 있습니다.
A = [ a b ] [ c d ]
첫 번째 열 [a, c] → i가 도착하는 곳두 번째 열 [b, d] → j가 도착하는 곳이 관점은 11주차 이후 A @ x를 단순 공식이 아니라 “벡터를 다른 위치로 보내는 계산”으로 이해하는 데 도움이 됩니다.
10. NumPy로 연결하기
다음 주에는 위 개념을 NumPy 코드로 실행합니다.
| 이번 주 수학 표현 | 11주차 NumPy 표현 | 주의할 점 |
|---|---|---|
| 벡터 | 1차원 배열 또는 2차원 열벡터 모양 | (3,)와 (3, 1)은 다름 |
| 행렬 | 2차원 배열 | shape가 행과 열을 알려 줌 |
행렬 크기 m × n | arr.shape == (m, n) | 계산 전 먼저 확인 |
| 행렬 덧셈 | A + B | 보통 같은 shape 필요 |
| 원소별 곱 | A * B | 행렬곱이 아님 |
| 행렬곱 | A @ B, A @ x | 안쪽 크기 확인 |
| 행/열 방향 계산 | axis=0, axis=1 | 어느 방향으로 모으는지 이해 필요 |
읽기 체크 모음
이번 주는 제출 실습 대신 아래 질문으로 이해도를 점검합니다.
- 점
(2, 3)과 벡터[2, 3]은 어떻게 다른가요? [2, 1] + [1, 3]의 결과를 성분별 계산과 화살표 그림으로 설명해 보세요.-2[1, 2]는 원래 벡터와 방향이 어떻게 달라지나요?2 × 3행렬에서 행과 열은 각각 몇 개인가요?- 두 행렬을 더하려면 어떤 조건이 필요한가요?
3 × 2행렬과2 × 1벡터를 곱하면 결과 크기는 무엇인가요?2 × 3행렬과3 × 4행렬의 곱은 가능한가요? 결과 크기는 무엇인가요?- NumPy에서
A * B와A @ B는 어떻게 다른가요?
다음 주 예고
11주차에서는 오늘 배운 벡터와 행렬을 NumPy 배열로 옮깁니다.
import numpy as np
A = np.array([[1, 2], [3, 4], [5, 6]])x = np.array([10, 20])
print(A.shape) # (3, 2)print(A @ x) # [ 50 110 170]다음 주의 핵심은 세 가지입니다.
- 계산 전
shape를 확인한다. - 원소별 연산과 행렬곱을 구분한다.
axis가 어느 방향으로 값을 모으는지 이해한다.
