728x90
넘파이(Numpy)란?
Numpy는 Python 기반의 수치 해석 라이브러리로, 선형대수 연산 및 다차원 배열 처리를 위한 다양한 함수를 제공합니다. Numerical Python의 약자이며, 과학 컴퓨팅과 데이터 분석에 자주 사용됩니다.
Numpy 설치 및 사용 방법
pip install numpy
# np(줄인말)는 표준화가 되어 있으며 numpy는 np로 사용합니다
import numpy as np
Numpy 배열과 파이썬 리스트의 차이점
연산 가능 여부
np.array([1, 2, 3]) + np.array([4, 5, 6]) # 결과: [5, 7, 9]
[1, 2, 3] + [4, 5, 6] # 결과: [1, 2, 3, 4, 5, 6]
- Numpy: 배열 간 수학 연산 가능
- Python List: 덧셈 시 요소 연결
스칼라 연산 지원 여부
np.array([1, 2, 3]) + 2 # 결과: [3, 4, 5]
[1, 2, 3] * 2 # 결과: [1, 2, 3, 1, 2, 3]
- Numpy: 배열의 모든 요소에 스칼라 연산 적용 가능
- Python List: 곱셈만 반복으로 해석
성능 차이
- Numpy 배열은 연산 속도가 빠르고 메모리 효율이 높습니다.
- Python 리스트는 유연하지만 대규모 데이터 처리에 적합하지 않습니다.
Numpy 배열의 특징
- 모든 요소의 타입이 동일해야 합니다.
- 각 차원(Dimension)을 축(axis)이라고 부릅니다.
Numpy 배열의 주요 속성
- .shape: 배열의 각 축의 크기
- .ndim: 배열의 차원 개수
- .dtype: 배열 요소의 데이터 타입
- .itemsize: 요소의 바이트 크기
- .size: 배열의 전체 요소 개수
예시 (2차원 배열)
a = np.arange(12).reshape(3, 4)
print(a)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
- .shape: (3, 4)
- .ndim: 2
- .dtype: int64
- .itemsize: 8 (int64의 바이트 크기)
- .size: 12
Numpy 배열 생성 방법
np.array: 튜플이나 리스트로 배열 생성
a = np.array([1, 2, 3])
print(a, a.dtype) # [1 2 3] int64
np.zeros, np.ones, np.empty, np.full
- np.zeros(shape): 0으로 구성된 배열 생성
- np.ones(shape): 1로 구성된 배열 생성
- np.empty(shape): 초기화되지 않은 배열 생성 (쓰레기 값 포함)
- np.full(shape, value): 특정 값으로 초기화된 배열 생성
print(np.zeros((3, 4)))
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
print(np.ones((2, 3, 4)))
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
print(np.empty((3, 2)))
[[4.95350151e-310 0.00000000e+000]
[3.68067497e+180 2.46345036e-154]
[2.65141253e+180 3.99461109e+252]]
print(np.full((3, 4), 10))
[[10 10 10 10]
[10 10 10 10]
[10 10 10 10]]
Numpy arange, linspace로 데이터 생성
np.arange와 np.linspace를 사용하면 연속적인 데이터를 쉽게 생성할 수 있습니다. 코드 성능은 동일하며, 상황에 따라 가독성을 고려해 선택하는 것이 좋습니다.
np.arange
- N만큼 차이나는 숫자 생성
- 끝 값은 포함하지 않음 (Python의 range()와 유사)
- 구간과 간격을 강조할 때 유리
np.arange([start], stop, [step])
- [start]와 [step]은 생략 가능
- stop은 포함하지 않음
np.linspace
- N등분한 숫자 생성
- 처음 값과 끝 값을 포함
- 개수 강조 시 사용하기 좋음
np.linspace(start, stop, num=50)
- 기본적으로 50개의 숫자 생성
예시 코드
# 1부터 20 미만까지 2 간격으로 생성
print(np.arange(1, 20, 2)) # [1 3 5 7 9 11 13 15 17 19]
# 1부터 5까지 0.6 간격으로 생성
print(np.arange(1, 5, 0.6)) # [1. 1.6 2.2 2.8 3.4 4. ]
# 0부터 50까지 총 10등분한 값 생성
a = np.linspace(0, 50, 10)
print(a) # [ 0. 5.5556 11.1111 ... 50.]
어떤 것을 사용해야 할까?
- np.arange: 간격(step)을 강조하고 싶을 때 사용
- np.linspace: 몇 등분(num)을 강조하고 싶을 때 사용
주의점
- np.arange의 결과는 간격(step)에 따라 정확히 맞아떨어지지 않을 수 있습니다. (예: 부동소수점 연산 오차)
- np.linspace는 시작과 끝 값을 포함하므로 구간의 끝이 정확해야 하는 경우 더 적합합니다.
Numpy 연산
numpy에서는 수치 연산이 기본적으로 element-wise 연산으로 수행됩니다.
Element-wise 연산이란?
- Element-wise: 동일한 위치에 있는 배열 원소끼리 연산을 수행하는 방식입니다.
- 축(axis)과 차원을 기준으로 같은 위치에 있는 원소끼리 연산됩니다.
예시 코드
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5, 6])
c = b - a # 배열의 동일 위치 원소끼리 뺄셈
d = b * a # 배열의 동일 위치 원소끼리 곱셈
print(a) # [1 2 3 4 5]
print(b) # [2 3 4 5 6]
print(c) # [1 1 1 1 1]
print(d) # [ 2 6 12 20 30]
Boolean 연산
Numpy는 Boolean 연산도 지원합니다.
print(a < 3) # [ True True False False False ]
Numpy 여러 가지 곱셈 연산
- *: 원소별 곱셈 (element-wise multiplication)
- @: 행렬 곱셈 (matrix multiplication)
- 주의: 2차원 이상의 배열에서 @는 선형대수의 행렬 곱을 수행합니다.
예시 코드
a = np.arange(1, 5).reshape(2, 2) # [[1, 2], [3, 4]]
b = np.arange(2, 6).reshape(2, 2) # [[2, 3], [4, 5]]
print(a * b) # element-wise 곱셈 -> [[2, 6], [12, 20]]
print(a @ b) # 행렬 곱셈 -> [[10, 13], [22, 29]]
Numpy 자동 형변환
- Numpy 배열은 같은 데이터 타입만 저장할 수 있습니다.
- 수치 연산 시 타입이 다르면 더 큰 범위의 타입으로 자동 변환됩니다.
타입 순서변환 방향
타입 순서 | 변환 방향 |
int < float < complex | 작은 타입 → 큰 타입 |
예시 코드 (자동 형변환)
a = np.array([1, 2, 3], dtype=int)
b = np.array([1.5, 2.5, 3.5], dtype=float)
c = a + b # int + float -> float로 자동 변환
print(c) # [2.5 4.5 6.5]
print(c.dtype) # float64
Numpy 집계 함수
Numpy에서는 여러 가지 집계 함수(aggregation function)를 제공합니다.
a = np.array([1, 2, 3, 4, 5])
print(a.sum()) # 15
print(a.min()) # 1
print(a.max()) # 5
print(a.argmax()) # 4 (최댓값의 인덱스)
print(a.cumsum()) # [1 3 6 10 15] (누적합)
축(axis) 기준 집계
- Numpy는 축(axis)를 기준으로 집계 연산을 수행할 수 있습니다.
- axis=0: 열(column) 기준
- axis=1: 행(row) 기준
a = np.array([[1, 2], [3, 4]])
print(a.sum(axis=0)) # [4 6] (열 기준 합)
print(a.sum(axis=1)) # [3 7] (행 기준 합)
Numpy의 범용 함수
Numpy는 다양한 범용 함수(universal function)를 제공합니다.
함수설명
함수 | 설명 |
add | 두 배열의 원소별 덧셈 |
subtract | 두 배열의 원소별 뺄셈 |
multiply | 두 배열의 원소별 곱셈 |
divide | 두 배열의 원소별 나눗셈 |
log | 각 원소의 로그 값 |
sin, cos, tan | 삼각 함수 |
예시 코드
a = np.array([0, np.pi / 2, np.pi])
print(np.sin(a)) # [0. 1. 0.]
print(np.log(np.array([1, np.e, np.e**2]))) # [0. 1. 2.]
728x90
'Python' 카테고리의 다른 글
[Python] Numpy 데이터 합치기, 쪼개기 (0) | 2024.10.20 |
---|---|
[Python] Numpy 인덱싱, 슬라이싱 (0) | 2024.10.20 |
[Python] 리스트 (0) | 2024.09.03 |
[Python] 함수 (0) | 2024.08.27 |
[Python] 반복문 (0) | 2024.08.27 |