05. NumPy 기초

🎯 이 장의 목표
  • NumPy가 무엇이고 왜 Pandas의 토대가 되는지 안다
  • 배열(array)을 만들고, 모양·타입을 확인할 수 있다
  • 배열 전체에 수학 연산을 한 번에 적용한다(벡터화)
  • 배열을 인덱싱·슬라이싱해 원하는 부분을 꺼낸다

먼저: NumPy가 뭔가요?

NumPy(넘파이, Numerical Python)는 숫자 계산, 특히 많은 숫자를 한꺼번에 빠르게 계산해 주는 파이썬 라이브러리입니다. Pandas는 내부적으로 NumPy 위에 지어져 있어서, NumPy를 알면 Pandas가 훨씬 잘 이해됩니다.

🔑 새 용어 — 배열(array)
NumPy의 핵심은 배열입니다. 리스트와 비슷하게 여러 숫자를 담지만, 모두 같은 타입이고 수학 연산에 최적화되어 훨씬 빠릅니다. 표 데이터의 한 줄·한 칸이 결국 이 배열로 표현됩니다.

먼저 import 합니다. 별명 np는 전 세계 공통 관례입니다.

PYTHON
import numpy as np

배열 만들기

리스트를 np.array()로 감싸면 배열이 됩니다.

PYTHON
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr)
print(type(arr))

실행 결과:

CODE
[1 2 3 4 5]
CODE
<class 'numpy.ndarray'>

(ndarray는 N-dimensional array, 즉 N차원 배열의 줄임말입니다.)

자주 쓰는 배열 생성 함수들:

PYTHON
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등분

실행 결과:

CODE
[0. 0. 0.]
[1. 1. 1.]
[0 2 4 6 8]
[0.   0.25 0.5  0.75 1.  ]

2차원 배열 (행과 열)

배열은 표처럼 2차원으로도 만들 수 있습니다. 리스트 안에 리스트를 넣으면 됩니다.

PYTHON
matrix = np.array([[1, 2, 3],
                   [4, 5, 6]])
print(matrix)

실행 결과:

CODE
[[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)으로 이어집니다.

모양·길이·타입 확인하기

배열의 정보를 확인하는 속성들입니다.

PYTHON
matrix = np.array([[1, 2, 3],
                   [4, 5, 6]])

print(matrix.shape)   # 모양 (행, 열)
print(matrix.ndim)    # 차원 수
print(matrix.size)    # 전체 요소 개수
print(matrix.dtype)   # 요소들의 데이터 타입

실행 결과:

CODE
(2, 3)
2
6
int64
🔑 새 용어 — shape와 dtype
  • shape(모양): (행 개수, 열 개수). 위는 2행 3열이라 (2, 3).
  • dtype(data type, 데이터 타입): 배열 안 요소들의 타입. int64는 64비트 정수를 뜻합니다. 이 dtype이라는 말은 Pandas에서도 똑같이 쓰이니 기억해 두세요.

벡터화: 배열 전체에 한 번에 연산

NumPy의 진짜 강점입니다. 리스트라면 반복문을 돌려야 할 계산을, 배열은 한 줄로 전체에 적용합니다.

PYTHON
arr = np.array([1, 2, 3, 4])

print(arr + 10)    # 모든 요소에 10 더하기
print(arr * 2)     # 모든 요소에 2 곱하기
print(arr ** 2)    # 모든 요소 제곱

실행 결과:

CODE
[11 12 13 14]
[2 4 6 8]
[1  4  9 16]
🔑 새 용어 — 벡터화(vectorization)
반복문 없이 배열 전체에 연산을 한 번에 적용하는 것을 "벡터화"라 합니다. 코드가 짧을 뿐 아니라 훨씬 빠릅니다. Pandas의 핵심 사고방식이기도 하니, "데이터는 하나씩 돌리지 말고 통째로 처리한다"를 기억하세요.

배열끼리도 연산됩니다 (같은 자리끼리).

PYTHON
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(a + b)

실행 결과:

CODE
[11 22 33]

유용한 통계 메서드

PYTHON
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())    # 표준편차

실행 결과:

CODE
31
3.875
9
1
2.5712...

💡 이 sum, mean, max 등은 Pandas에서 거의 똑같은 이름으로 다시 등장합니다.

인덱싱과 슬라이싱: 원하는 부분 꺼내기

리스트와 같은 방식으로, 번호는 0부터 셉니다.

PYTHON
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번부터 끝까지

실행 결과:

CODE
10
50
[20 30 40]
[10 20 30]
[30 40 50]
🔑 새 용어 — 슬라이싱(slicing)
[시작:끝] 형태로 배열의 일부 구간을 잘라내는 것입니다. 끝 번호는 포함되지 않습니다(1:4는 1,2,3번). 이 규칙도 Pandas로 그대로 이어집니다.

조건으로 요소 선택 (불리언 인덱싱)

조건을 주면, 조건을 만족하는 요소만 골라낼 수 있습니다. 데이터 분석에서 어마어마하게 자주 씁니다.

PYTHON
arr = np.array([3, 8, 1, 9, 4, 7])

print(arr > 5)         # 각 요소가 5보다 큰지 (참/거짓 배열)
print(arr[arr > 5])    # 5보다 큰 요소만 골라내기

실행 결과:

CODE
[False  True False  True False  True]
[8 9 7]

읽는 법: arr[arr > 5]는 "arr에서 (5보다 큰) 조건이 참인 자리만 꺼내라." Pandas에서 "조건에 맞는 행만 보기"가 정확히 이 방식입니다.

🛠 미니 챌린지

  1. 1부터 10까지의 배열을 만들고(np.arange 활용), 모든 요소를 제곱한 결과를 출력하세요.
  2. 배열 [12, 5, 8, 20, 3]의 합계와 평균을 출력하세요.
  3. 같은 배열에서 10보다 큰 요소만 골라 출력하세요.

✅ 미니 챌린지 해설

PYTHON
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]

PYTHON
# 2. 합계와 평균
arr = np.array([12, 5, 8, 20, 3])
print(arr.sum())
print(arr.mean())

실행 결과:

CODE
48
9.6
PYTHON
# 3. 조건으로 선택
print(arr[arr > 10])

실행 결과: [12 20]

이 장에서 배운 것

  • NumPy는 많은 숫자를 빠르게 계산하는 라이브러리이며, Pandas의 토대다.
  • np.array()로 배열을 만들고, shape·dtype으로 모양과 타입을 확인한다.
  • 1-D / 2-D 구분은 Pandas의 시리즈 / 데이터프레임으로 이어진다.
  • 벡터화 덕분에 배열 전체에 연산을 한 번에 적용할 수 있다.
  • 슬라이싱([시작:끝], 끝 제외)과 조건 선택(arr[arr > 5])으로 원하는 부분을 꺼낸다.

✍️ 확인 문제

  1. 배열의 shape(3, 4)라면 몇 행 몇 열인가요?
  2. "벡터화"란 무엇이며, 왜 좋은가요?
  3. arr = np.array([5, 10, 15, 20])일 때 arr[arr >= 10]의 결과는 무엇인가요?
Python과 NumPy 기초가 끝났습니다! 이제 든든한 토대 위에서, 이 안내서의 진짜 주인공 Pandas로 들어갑니다.
👉 06. 데이터 분석이란, 그리고 왜 배우는가 (1부로) 또는 바로 08. 시리즈란 무엇인가