05. NumPy 기초
- NumPy가 무엇이고 왜 Pandas의 토대가 되는지 안다
- 배열(array)을 만들고, 모양·타입을 확인할 수 있다
- 배열 전체에 수학 연산을 한 번에 적용한다(벡터화)
- 배열을 인덱싱·슬라이싱해 원하는 부분을 꺼낸다
먼저: NumPy가 뭔가요?
NumPy(넘파이, Numerical Python)는 숫자 계산, 특히 많은 숫자를 한꺼번에 빠르게 계산해 주는 파이썬 라이브러리입니다. Pandas는 내부적으로 NumPy 위에 지어져 있어서, NumPy를 알면 Pandas가 훨씬 잘 이해됩니다.
🔑 새 용어 — 배열(array)
NumPy의 핵심은 배열입니다. 리스트와 비슷하게 여러 숫자를 담지만, 모두 같은 타입이고 수학 연산에 최적화되어 훨씬 빠릅니다. 표 데이터의 한 줄·한 칸이 결국 이 배열로 표현됩니다.
먼저 import 합니다. 별명 np는 전 세계 공통 관례입니다.
import numpy as np
배열 만들기
리스트를 np.array()로 감싸면 배열이 됩니다.
import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(arr) print(type(arr))
실행 결과:
[1 2 3 4 5]
<class 'numpy.ndarray'>
(ndarray는 N-dimensional array, 즉 N차원 배열의 줄임말입니다.)
자주 쓰는 배열 생성 함수들:
print(np.zeros(3)) # 0으로 채운 배열 print(np.ones(3)) # 1로 채운 배열 print(np.arange(0, 10, 2)) # 0부터 10 전까지 2씩 (range의 배열 버전) print(np.linspace(0, 1, 5))# 0~1을 5등분
실행 결과:
[0. 0. 0.] [1. 1. 1.] [0 2 4 6 8] [0. 0.25 0.5 0.75 1. ]
2차원 배열 (행과 열)
배열은 표처럼 2차원으로도 만들 수 있습니다. 리스트 안에 리스트를 넣으면 됩니다.
matrix = np.array([[1, 2, 3], [4, 5, 6]]) print(matrix)
실행 결과:
[[1 2 3] [4 5 6]]
🔑 새 용어 — 차원(dimension), 1-D와 2-D
- 1-D(1차원): 한 줄로 늘어선 배열
[1, 2, 3]. 데이터로 치면 한 열(또는 한 행).- 2-D(2차원): 행과 열을 가진 표 모양
[[...], [...]]. 엑셀 시트 같은 모양.
이 1-D / 2-D 구분은 Pandas에서 시리즈(1-D)와 데이터프레임(2-D)으로 이어집니다.
모양·길이·타입 확인하기
배열의 정보를 확인하는 속성들입니다.
matrix = np.array([[1, 2, 3], [4, 5, 6]]) print(matrix.shape) # 모양 (행, 열) print(matrix.ndim) # 차원 수 print(matrix.size) # 전체 요소 개수 print(matrix.dtype) # 요소들의 데이터 타입
실행 결과:
(2, 3) 2 6 int64
🔑 새 용어 — shape와 dtype
- shape(모양):
(행 개수, 열 개수). 위는 2행 3열이라(2, 3).- dtype(data type, 데이터 타입): 배열 안 요소들의 타입.
int64는 64비트 정수를 뜻합니다. 이dtype이라는 말은 Pandas에서도 똑같이 쓰이니 기억해 두세요.
벡터화: 배열 전체에 한 번에 연산
NumPy의 진짜 강점입니다. 리스트라면 반복문을 돌려야 할 계산을, 배열은 한 줄로 전체에 적용합니다.
arr = np.array([1, 2, 3, 4]) print(arr + 10) # 모든 요소에 10 더하기 print(arr * 2) # 모든 요소에 2 곱하기 print(arr ** 2) # 모든 요소 제곱
실행 결과:
[11 12 13 14] [2 4 6 8] [1 4 9 16]
🔑 새 용어 — 벡터화(vectorization)
반복문 없이 배열 전체에 연산을 한 번에 적용하는 것을 "벡터화"라 합니다. 코드가 짧을 뿐 아니라 훨씬 빠릅니다. Pandas의 핵심 사고방식이기도 하니, "데이터는 하나씩 돌리지 말고 통째로 처리한다"를 기억하세요.
배열끼리도 연산됩니다 (같은 자리끼리).
a = np.array([1, 2, 3]) b = np.array([10, 20, 30]) print(a + b)
실행 결과:
[11 22 33]
유용한 통계 메서드
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6]) print(arr.sum()) # 합계 print(arr.mean()) # 평균 print(arr.max()) # 최댓값 print(arr.min()) # 최솟값 print(arr.std()) # 표준편차
실행 결과:
31 3.875 9 1 2.5712...
💡 이 sum, mean, max 등은 Pandas에서 거의 똑같은 이름으로 다시 등장합니다.
인덱싱과 슬라이싱: 원하는 부분 꺼내기
리스트와 같은 방식으로, 번호는 0부터 셉니다.
arr = np.array([10, 20, 30, 40, 50]) print(arr[0]) # 첫 번째 print(arr[-1]) # 마지막 print(arr[1:4]) # 1번부터 3번까지 (4는 제외) print(arr[:3]) # 처음부터 2번까지 print(arr[2:]) # 2번부터 끝까지
실행 결과:
10 50 [20 30 40] [10 20 30] [30 40 50]
🔑 새 용어 — 슬라이싱(slicing)[시작:끝]형태로 배열의 일부 구간을 잘라내는 것입니다. 끝 번호는 포함되지 않습니다(1:4는 1,2,3번). 이 규칙도 Pandas로 그대로 이어집니다.
조건으로 요소 선택 (불리언 인덱싱)
조건을 주면, 조건을 만족하는 요소만 골라낼 수 있습니다. 데이터 분석에서 어마어마하게 자주 씁니다.
arr = np.array([3, 8, 1, 9, 4, 7]) print(arr > 5) # 각 요소가 5보다 큰지 (참/거짓 배열) print(arr[arr > 5]) # 5보다 큰 요소만 골라내기
실행 결과:
[False True False True False True] [8 9 7]
읽는 법: arr[arr > 5]는 "arr에서 (5보다 큰) 조건이 참인 자리만 꺼내라." Pandas에서 "조건에 맞는 행만 보기"가 정확히 이 방식입니다.
🛠 미니 챌린지
1부터10까지의 배열을 만들고(np.arange활용), 모든 요소를 제곱한 결과를 출력하세요.- 배열
[12, 5, 8, 20, 3]의 합계와 평균을 출력하세요. - 같은 배열에서 10보다 큰 요소만 골라 출력하세요.
✅ 미니 챌린지 해설
import numpy as np # 1. 1~10 배열과 제곱 (arange(1, 11) → 1부터 10까지) arr = np.arange(1, 11) print(arr ** 2)
실행 결과: [ 1 4 9 16 25 36 49 64 81 100]
# 2. 합계와 평균 arr = np.array([12, 5, 8, 20, 3]) print(arr.sum()) print(arr.mean())
실행 결과:
48 9.6
# 3. 조건으로 선택 print(arr[arr > 10])
실행 결과: [12 20]
이 장에서 배운 것
- NumPy는 많은 숫자를 빠르게 계산하는 라이브러리이며, Pandas의 토대다.
np.array()로 배열을 만들고,shape·dtype으로 모양과 타입을 확인한다.- 1-D / 2-D 구분은 Pandas의 시리즈 / 데이터프레임으로 이어진다.
- 벡터화 덕분에 배열 전체에 연산을 한 번에 적용할 수 있다.
- 슬라이싱(
[시작:끝], 끝 제외)과 조건 선택(arr[arr > 5])으로 원하는 부분을 꺼낸다.
✍️ 확인 문제
- 배열의
shape가(3, 4)라면 몇 행 몇 열인가요? - "벡터화"란 무엇이며, 왜 좋은가요?
arr = np.array([5, 10, 15, 20])일 때arr[arr >= 10]의 결과는 무엇인가요?
Python과 NumPy 기초가 끝났습니다! 이제 든든한 토대 위에서, 이 안내서의 진짜 주인공 Pandas로 들어갑니다.
👉 06. 데이터 분석이란, 그리고 왜 배우는가 (1부로) 또는 바로 08. 시리즈란 무엇인가