10주차 · NumPy를 위한 행렬과 벡터 기초
이번 주는 코딩 실습보다 수학적 배경 이해가 목표입니다. 이 장을 마치면 다음을 설명할 수 있어야 합니다.
- 점, 벡터, 행렬을 구분한다.
- 벡터 덧셈을 성분별 계산과 화살표 그림으로 설명한다.
- 스칼라배가 벡터의 길이와 방향을 어떻게 바꾸는지 설명한다.
- 행렬을 행(row), 열(column), 원소, 크기(
m × n)로 읽는다. - 행렬 덧셈과 스칼라배가 같은 위치의 칸끼리 계산되는 이유를 설명한다.
- 행렬-벡터 곱을 “행마다 하나의 가중합을 만드는 계산”으로 설명한다.
- 행렬-행렬 곱이 가능한 조건과 결과 크기를 판단한다.
- NumPy에서
shape,axis,*,@를 배울 때 어떤 수학 개념과 연결되는지 말한다.
왜 NumPy 전에 행렬과 벡터를 배우나요?
Section titled “왜 NumPy 전에 행렬과 벡터를 배우나요?”Python 리스트에 숫자를 넣는 것만으로도 간단한 계산은 할 수 있습니다. 하지만 공학 데이터는 금방 다음처럼 커집니다.
| 데이터 상황 | 수학적으로 보는 모양 | NumPy에서 만날 모양 |
|---|---|---|
| 전압값 하나 | 스칼라 | 3.3 |
| 전압을 5번 측정 | 벡터 | shape == (5,) |
| 3개 센서를 4번 측정 | 행렬 | shape == (4, 3) |
| 이미지 한 장 | 여러 축을 가진 배열 | height × width × color |
즉, NumPy는 단순히 “빠른 리스트”가 아닙니다. 벡터와 행렬의 계산 규칙을 코드로 옮긴 도구입니다.
0. 기본 용어 정리
Section titled “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. 점과 벡터: 같은 숫자쌍도 다르게 읽을 수 있습니다
Section titled “1. 점과 벡터: 같은 숫자쌍도 다르게 읽을 수 있습니다”좌표평면에서 (2, 3)은 보통 점의 위치를 뜻합니다. 하지만 벡터로 읽으면 뜻이 조금 달라집니다.
| 표현 | 읽는 법 |
|---|---|
점 (2, 3) | x=2, y=3인 위치 |
벡터 [2, 3] | 오른쪽으로 2, 위로 3 이동하는 화살표 |
벡터를 성분으로 읽기
Section titled “벡터를 성분으로 읽기”v = [2, 3]
첫 번째 성분 2 → x 방향으로 2칸두 번째 성분 3 → y 방향으로 3칸벡터를 처음 배울 때는 “화살표”와 “숫자 묶음”을 번갈아 떠올리세요.
- 그림으로 보면: 이동 화살표
- 계산으로 보면: 같은 위치 성분끼리 계산하는 숫자 묶음
2. 벡터 덧셈: 두 번 움직이면 한 번의 움직임이 됩니다
Section titled “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. 스칼라배: 같은 방향으로 늘리거나 반대로 뒤집기
Section titled “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. 가중합과 내적: 같은 위치끼리 곱해 모두 더하기
Section titled “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. 행렬: 숫자가 들어 있는 직사각형 표
Section titled “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 인덱스
Section titled “수학 인덱스와 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. 행렬 덧셈과 스칼라배: 같은 위치끼리 계산합니다
Section titled “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. 행렬-벡터 곱: 여러 개의 가중합을 한 번에 계산합니다
Section titled “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 ]행렬-벡터 곱은 행렬의 각 행이 벡터와 만나 결과 숫자 하나씩을 만드는 계산입니다.
조금 더 깊게 보기: 열을 섞어서 결과 만들기
Section titled “조금 더 깊게 보기: 열을 섞어서 결과 만들기”처음에는 “행마다 가중합” 관점만 확실히 잡아도 됩니다. 다음 관점은 행렬곱이 왜 벡터를 바꾸는 계산인지 이해할 때 도움이 됩니다.
행렬-벡터 곱은 두 가지 방식으로 볼 수 있습니다.
| 관점 | 읽는 법 | 초심자에게 좋은 이유 |
|---|---|---|
| 행마다 내적 계산 | 각 행이 벡터와 만나 결과 하나를 만듦 | 계산 절차가 분명함 |
| 열벡터의 선형결합 | 벡터 성분만큼 행렬의 열들을 섞음 | 변환 관점으로 연결됨 |
열벡터의 선형결합으로 보면 위 계산은 다음과 같습니다.
Ax = 10 [ 1 ] + 20 [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]8. 행렬-행렬 곱: 행과 열이 만납니다
Section titled “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가 다름결과의 한 칸은 어떻게 만들어지나요?
Section titled “결과의 한 칸은 어떻게 만들어지나요?”결과 행렬의 한 칸은 다음 두 줄이 만나서 만들어집니다.
- 앞 행렬의 한 행
- 뒤 행렬의 한 열
결과의 (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. 행렬을 변환으로 보기: 격자가 움직입니다
Section titled “9. 행렬을 변환으로 보기: 격자가 움직입니다”행렬은 숫자표로만 볼 수도 있지만, 벡터를 움직이는 규칙으로 볼 수도 있습니다.
예를 들어 다음 행렬을 생각해 봅시다.
A = [ 2 0 ] [ 0 1 ]이 행렬은 x 방향은 2배로 늘리고, y 방향은 그대로 둡니다.
행렬의 첫 번째 열은 기본 x 화살표가 도착하는 곳, 두 번째 열은 기본 y 화살표가 도착하는 곳으로 볼 수 있습니다.
기본 화살표 관점
Section titled “기본 화살표 관점”좌표평면의 기본 화살표 두 개를 생각해 봅시다. 선형대수학에서는 이런 기본 화살표를 기저벡터라고도 부릅니다.
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로 연결하기
Section titled “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 | 어느 방향으로 모으는지 이해 필요 |
읽기 체크 모음
Section titled “읽기 체크 모음”이번 주는 제출 실습 대신 아래 질문으로 이해도를 점검합니다.
- 점
(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는 어떻게 다른가요?
다음 주 예고
Section titled “다음 주 예고”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가 어느 방향으로 값을 모으는지 이해한다.