Numpy(수치 계산 라이브러리)
- Numerical Python의 약자로 대표적인 파이썬 기반 수치 해석 라이브러리
- 선형대수 연산에 필요한 다차원 배열과 배열 연산을 수행하는 다양한 함수 제공
import numpy as np
Numpy 배열
- numpy에서 배열은 ndarray 또는 array 부름
- numpy.array와 python.array는 다름
- numpy array는 numpy array끼리 연산이 가능하지만 python list는 덧셈만 가능
- numpy array : [10, 5, 3, 7, 1, 5] + [10, 5, 3, 7, 1, 5] = [20, 10, 6, 14, 2, 10]
- python list : [10, 5, 3, 7, 1, 5] + [10, 5, 3, 7, 1, 5] = [10, 5, 3, 7, 1, 5, 10, 5, 3, 7, 1, 5]
- numpy array는 array 전체에 연산이 가능하지만 Python list는 곱셈(list 요소 반복)만 가능
- numpy array : [10, 5, 3, 7, 1, 5] + 5 = [15, 10, 8, 12, 6, 10]
- pyhon list : [10, 5, 3, 7, 1, 5] * 2 = [10, 5, 3, 7, 1, 5, 10, 5, 3, 7, 1, 5]
numpy array가 python list에 비해 문법이 간단하고 성능이 뛰어나다
- numpy는 모든 배열의 값이 기본적으로 같은 타입
- numpy에서 각 차원(Dimension)을 축(axis)이라고 표현
배열 예제
[[1, 0, 0],
[0, 1, 2]]
[1, 2, 1]
Numpy 배열 대표 속성값
- ndarray.shape : 배열의 각 축(axis)의 크기
- ndarray.ndim : 축의 개수(Dimension)
- ndarray.dtype : 각 요소(Element)의 타입
- ndarray.itemsize : 각 요소(Element)의 타입의 bytes 크기
- ndarray.size : 전체 요소(Element)의 개수
a = np.arange(12).reshape(3, 4)
print(a)
shape
print(a.shape)
dtype
print(a.dtype)
itemsize
print(a.itemsize)
size
print(a.size)
Numpy 배열 생성
- np.array를 이용하여 Python에서 사용하는 Tuple(튜플)이나 List(리스트)를 입력으로 numpy.ndarray를 생성
- np.zeros, np.ones, np.empty를 이용ㄹ하여 다양한 차원의 데이터를 쉽게 생성 가능
- np.zeros(shape) : 0으로 구성된 N차원 배열 생성
- np.ones(shape) : 1로 구성된 N차원 배열 생성
- np.empty(shape) : 초기화되지 않은 N차원 배열 생성
np.zeros
print(np.zeros((3,4)))
np.ones
print(np.ones((2,3,4), dtype=np.int64))
np.empty
print(np.empty((2,3)))
arrange와 linspace 데이터 생성, 배열 출력
- np.arrange와 np.linspace를 이용하여 연속적인 데이터를 쉽게 생성 가능
- np.arrange : N 만큼 차이나는 숫자 생성
- np.linspace : N 등분한 숫자 생성
- np.arrange와 np.linspace의 차이점
- np.arrange([start], stop, [step]..)
- []생략 가능, 끝 값 포함 안함
- 장점 : step, 범위를 구간, 간격 강조할 때 사용하면 코드 가독성 높아짐
- np.linspace(start, stop, num-50..)
- 처음 값과 끝 값 포함, 몇 개로 만들지 매개변수로 줌
- 장점 : 개수 강조할 때 사용하면 코드 가독성 높아짐
np.arange
print(np.arange(10, 30, 5))
print(np.arange(0, 2, 0.3))
np.linspace
x = np.linspace(0, 99, 100)
print(x)
Numpy 배열 출력
- 1D와 2D 배열은 설명하지 않아도 어떻게 출력되는지 확인할 수 있음
- 3D 배열은 2차원이 N개 출력되는 형식으로 나타남
1차원
a = np.arange(6)
print(a)
2차원
b = np.arange(12).reshape(4,3)
print(b)
3차원
c = np.arange(24).reshape(2,3,4)
print(c)
기본 연상 및 범용 함수
NumPy 기본 연산
- numpy에서 수치 연산은 기본적으로 element wise 연산
- 차원(축)을 기준으로 행렬 내에서 같은 위치에 있는 원소끼리 연산을 하는 방식
- numpy 여러가지 곱셈 존재
- * : 각각의 원소끼리 곱셈(Elementwise product, Hadamard product)
- @ : 행렬 곱셈 (Matrix product)
a = np.array([20, 30, 40, 50])
b = np.arange(4)
print(a)
print(b)
c = a - b
print(c)
print(b**2)
print(10*a)
print(a < 35)
A = np.array( [[1,1],
[0,1]])
B = np.array( [[2,0],
[3,4]])
print(A)
print(B)
print(A * B)
print(A @ B)
- numpy 자동 형 변환
- 수치 연산을 진행할 때 각각의 .dtype이 다르면 타입이 큰쪽 (int < float < complex)으로 자동으로 변경
a = np.ones(3, dtype=np.int32)
b = np.linspace(0, np.pi, 3)
print(a)
print(b)
print(a.dtype)
print(b.dtype)
c = a + b
print(c)
print(c.dtype)
d = np.exp(c*1j)
print(d)
print(d.dtype)
numpy 집계함수
- .sum : 모든 요소의 합
- .min : 모든 요소 중 최소값
- .max : 모든 요소 중 최대 값
- .argmax : 모든 요소 중 최대값의 인덳
- .cumsum : 모든 요소의 누적합
a = np.arange(8).reshape(2,4)**2
print(a)
sum
print(a)
print(a.sum())
min
print(a.min())
max
print(a.max())
argmax
print(a)
print(a.argmax())
cumsum
print(a)
print(a.cumsum())
axis
- numpy 집계함수 axis 값을 매개변수로 입력
- 축을 기준으로 연산 가능
- axis = 0 (열 기준)
- axis = 1 (행 기준)
b = np.arange(12).reshape(3, 4)
print(b.sum(axis=0))
print(b.sum(axis=1))
인덱싱과 슬라이싱 및 크기 변경
Numpy 인덱싱과 슬라이싱
- numpy 인덱싱(indexing, 가리킴)과 슬라이싱(slicing, 잘라냄)
- 각각 문자열에서 한 개 또는 여러 개를 가리켜서 그 값을 가져오거나 뽑아내는 방법
- numpy 인덱스 배열로 인덱싱
a = np.arange(10)**2
print(a)
print(a[2])
print(a[2:5])
print(a[ : :-1])
a[0:6:2] = 1000
print(a)
a = np.arange(8)**2
i = np.array([1, 1, 3, 5])
print(a[i])
j = np.array([[3,4], [2,5]])
print(a[j])
numpy boolean 인덱싱
- boolean 타입을 가진 값들로 인덱싱 진행
a = np.arange(12).reshape(3,4)
b = a > 4
print(a[b])
a[b].shape
a[b] = 0
print(a)
numpy 크기 변경
- np.ndarray의 shape를 다양한 방법으로 변경 간으
- .ravel : 1차원으로 변경
- .reshape : 지정한 차원으로 변경
- .T : 전치(Transpose) 변환
a = np.arange(12).reshape(3, 4)
ravel
print(a.ravel())
print(a.reshape(-1))
reshape
print(a.reshape(2,6))
T
print(a.T)
print(a.T.shape)
데이터 합치기, 쪼개기
numpy 데이터 합치기
- np.vstack와 np.hstack을 통해 데이터 합치기
- np.vstack : axis=0(열)기준으로 쌓음
- np.hstack : axis=1(행)기준으로 쌓음
a = np.array([1, 2, 3, 4]).reshape(2, 2)
b = np.array([5, 6, 7, 8]).reshape(2, 2)
vstack
print(np.vstack((a,b)))
hstack
print(np.hstack((a,b)))
numpy 데이터 쪼개기
- np.hsplit을 통해 숫자 1개가 들어갈 경우, X개로 등분
- np.hsplit을 통해 리스트로 넣을 경우, axis=1(행) 기준 인덱스로 데이터를 분할
a = np.arange(12).reshape(2, 6)
hsplit
print(np.hsplit(a, 3))
print(np.hsplit(a, (3,4)))