🔢 NumPy 완전 정복! 데이터 분석의 첫 걸음
파이썬으로 숫자를 빠르게 다루고 싶다면? NumPy를 배워야 한다!
1. NumPy란 무엇인가?
**NumPy(Numerical Python)**는 파이썬에서 대규모 수치 데이터를 빠르게 처리하기 위한 라이브러리다.
데이터 과학, 머신러닝, 과학 계산 등 거의 모든 파이썬 데이터 작업의 기반이 되는 핵심 도구다.
NumPy의 핵심 자료구조는 ndarray(N차원 배열) 이다.
import numpy as np # numpy는 외부 라이브러리이므로 반드시 임포트해야 한다
arr = np.array([1, 2, 3, 4, 5])
print(type(arr)) # <class 'numpy.ndarray'>
2. 왜 NumPy를 써야 할까?
파이썬 기본 리스트로도 숫자를 다룰 수 있다. 하지만 데이터가 많아지면 속도 차이가 크게 난다.
# ❌ 파이썬 리스트: 하나씩 반복해야 한다 (느리다!)
numbers = [1, 2, 3, 4, 5]
result = []
for num in numbers:
result.append(num * 2)
print(result) # [2, 4, 6, 8, 10]
# ✅ NumPy: 내부적으로 C를 이용 속도가 빠르다!
import numpy as np
numbers = np.array([1, 2, 3, 4, 5])
result = numbers * 2
print(result) # [2 4 6 8 10]
💡 NumPy는 "수학 계산기"라고 생각하면 된다. 리스트가 일일이 손으로 계산하는 것이라면, NumPy는 계산기로 한 번에 처리하는 것이다!
3. 배열 생성하기
3-1. 기본 배열 생성
import numpy as np
# 1차원 배열
arr1d = np.array([1, 2, 3, 4, 5])
print("1차원 배열:", arr1d)
# 출력: [1 2 3 4 5]
# 2차원 배열
arr2d = np.array([[10, 20, 30], [40, 50, 60]])
print("2차원 배열:\n", arr2d)
# 출력:
# [[10 20 30]
# [40 50 60]]
3-2. 특수 배열 생성
# 단위행렬 (대각선이 1, 나머지는 0)
eye = np.eye(3)
print(eye)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
# 균등한 간격의 배열 만들기 (시작, 끝, 개수)
theta = np.linspace(0, 10, 5)
print(theta) # [ 0. 2.5 5. 7.5 10. ]
3-3. 랜덤 배열 생성
# 50~100 사이 정수 5개 랜덤 생성
scores = np.random.randint(low=50, high=101, size=5)
print("랜덤 점수:", scores)
# 예시 출력: [88 91 66 74 100]
# 표준정규분포(평균 0, 표준편차 1인 분포)로부터 3x3 배열 생성 - 0근처 숫자들이 많고 멀수록 드물다.
randn_arr = np.random.randn(3, 3)
print(randn_arr)
# randint - 정수, randn(rand normal) - 정규 분포: 실수
4. 배열의 속성 확인하기
배열도 클래스의 인스턴스이므로, 다양한 속성(attribute)과 메서드(method)를 갖고 있다.
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # (2, 3) → 2행 3열
print(arr.dtype) # int64 → 데이터 타입
print(arr.mean()) # 3.5 → 평균값
print(arr.sum()) # 21 → 합계
5. 배열 수정하기
5-1. 특정 원소 변경
x = np.eye(3) # 3x3 단위행렬
print(x[0, 2]) # 0.0 → 0행 2열 원소
x[0, 2] = 1 # 값 변경
print(x[0, 2]) # 1.0
5-2. 자료형 변환 (astype)
x = np.eye(3)
x_bool = x.astype(bool) # bool 타입으로 변환
x_int = x.astype(int) # int 타입으로 변환
x_float = x * 1.1 # float 연산
print(x_bool.dtype) # bool
print(x_int.dtype) # int64
print(x_float)
[[1.1 0. 0. ]
[0. 1.1 0. ]
[0. 0. 1.1]]
6. 배열 변환하기
6-1. tile - 배열 복제
v = np.array([1, 2, 3])
# v를 3번 반복하여 3x3 행렬 만들기
V = np.tile(v, (3, 1)) #tile(A, repetitions) - nparray, 반복회수(튜플 가능)
print(V)
# [[1 2 3]
# [1 2 3]
# [1 2 3]]
6-2. flatten - 1차원으로 펼치기
V_vector = V.flatten()
print(V_vector)
# [1 2 3 1 2 3 1 2 3]
print(V_vector.shape) # (9,)
7. 행렬 연산
x = np.eye(3)
y = np.random.randn(3, 3)
# 행렬곱 계산
z = np.dot(x, y)
print(z.shape) # (3, 3)
8. 수학 함수 적용하기
NumPy는 삼각함수, 지수함수 등 다양한 수학 함수를 배열 전체에 한 번에 적용할 수 있다.
import matplotlib.pyplot as plt
# 0부터 2π까지 균등한 간격의 값 100개
theta = np.linspace(0, 2 * np.pi, 100)
# 각 원소에 sin 함수 적용
sin_theta = np.sin(theta)
# 시각화
plt.plot(theta, sin_theta)
plt.title("Sine Curve")
plt.xlabel("θ (radians)")
plt.ylabel("sin(θ)")
plt.show()
9. 자주 쓰는 NumPy 함수 요약
| 함수 |
설명 |
예시 |
| np.array() |
배열 생성 |
np.array([1,2,3]) |
| np.eye(n) |
n×n 단위행렬 |
np.eye(3) |
| np.linspace(a,b,n) |
a~b 균등 n개 |
np.linspace(0, 1, 5) |
| np.random.randint() |
정수 랜덤 배열 |
np.random.randint(0, 10, 5) |
| np.random.randn() |
정규분포 랜덤 배열 |
np.random.randn(3, 3) |
| np.dot(a, b) |
행렬곱 |
np.dot(x, y) |
| np.sin() |
sin 함수 |
np.sin(theta) |
| .shape |
배열 크기 확인 |
arr.shape |
| .dtype |
데이터 타입 확인 |
arr.dtype |
| .astype() |
데이터 타입 변환 |
arr.astype(int) |
| .flatten() |
1차원으로 펼치기 |
arr.flatten() |
| .mean() |
평균 계산 |
arr.mean() |
마무리
NumPy는 파이썬 데이터 분석의 필수 기초 도구다.
처음에는 낯설더라도 직접 코드를 실행하며 익히면 금방 친숙해진다!
다음 단계로는 Pandas(데이터프레임 처리)와 Matplotlib(데이터 시각화)을 학습하면 데이터 분석의 기본 삼각편대가 완성된다. 🚀