설명
Numpy는 C언어로 구현된 파이썬 라이브러리
고성능의 수치계산을 위해 제작
벡터 및 행렬 연산에 있어서 매우 편리한 기능을 제공
설치
> pip install numpy
Python
복사
자료 구조
벡터(vector)
•
1차원 데이터(1차원 배열)
•
스칼라가 연속적으로 여러개 모여 있는것
◦
스칼라(scalar) : 단순하게 측정한 하나의 값
import numpy as np
lst = [1,2,3,4,5]
vector = np.array(lst)
Python
복사
행렬(Matirx)
•
2차원 데이터(2차원 배열)
•
1차원 데이터가 여러개 모여 있는것
import numpy as np
lst = [
[1,2,3],
[4,5,6]
]
matrix = np.array(lst)
Python
복사
기능
numpy.ndarray
# python list를 이용한 배열 생성
lst = [
[1,2,3],
[4,5,6]
]
arr = np.array(lst)
arr
# array([[1, 2, 3], [4, 5, 6]])
Python
복사
##ndarray[1dim index, 2dim index … ndim index]
arr2[1,1] # 스칼라 조회
# 5
Python
복사
ndarray.ndim
•
어레이의 차원의 수 반환
arr.ndim # 차원의 수
# 2
Python
복사
ndarray.shape
•
어레이의 크기를 나타내는 정수 튜플(행수,열수)
arr.shape # 차원의 모양(벡터 수, 스칼라 수)
(2, 3)
Python
복사
ndarray.size
•
어레이의 요소의 총 개수(shape 요소의 곱과 같음)
arr.size # 스칼라 전체 수
# 6
Python
복사
데이터 타입 변환
ndarray.dtype
•
어레이의 요소의 데이터 타입 반환
arr.dtype # arr의 데이터 자료형 확인
dtype('int64')
Python
복사
ndarray.astype()
•
데이터 타입 변환
arr = arr.astype(np.float32) # 데이터 타입 변환
arr.dtype
# dtype('float32')
Python
복사
ndarray.변경할데이터타입()
•
데이터 타입 변환
arr = np.int8(arr) # 데이터 타입 변환
arr.dtype
# dtype('int8')
Python
복사
배열 생성/기존배열 수정 시 데이터타입 지정
arr = np.int8(arr) # 데이터 타입 변환
arr.dtype
# dtype('int8')
arr = np.array([1,2,3],dtype = np.int32) # 4바이트 크기의 정수
arr.dtype, arr
# (dtype('int32'), array([1, 2, 3], dtype=int32))
arr = np.array([1,2,3],dtype=np.uint8) # 1바이트 크기의 부호 없는 정수(0~255)
arr.dtype, arr
# (dtype('uint8'), array([1, 2, 3], dtype=uint8))
arr = np.array([1,2,3],dtype=np.float64) # 8바이트 크기의 실수
arr.dtype, arr
# (dtype('float64'), array([1., 2., 3.]))
arr = np.array([1,0,1],dtype=np.bool_)
arr.dtype, arr
# (dtype('bool'), array([ True, False, True]))
Python
복사
슬라이싱 및 인덱싱 가능
arr = np.array([1, 2, 3])
arr
# array([1, 2, 3])
arr[1], arr[-1]
# (2, 3)
arr[0:2]
# array([1, 2])
arr[1:]
# array([2, 3])
arr[:2]
# array([1, 2])
arr[-2:]
# array([2, 3])
arr[::-1]
# array([3, 2, 1])
Python
복사
배열 조건 연산
일반 조건 연산
arr = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
arr
# array([[ 1, 2, 3, 4],
# [ 5, 6, 7, 8],
# [ 9, 10, 11, 12]])
arr[arr < 5]
# array([1, 2, 3, 4])
cond = (arr >= 5)
arr[cond]
# array([ 5, 6, 7, 8, 9, 10, 11, 12])
arr[arr%2 == 0]
# array([ 2, 4, 6, 8, 10, 12])
cond = (arr > 2) & (arr < 11)
arr[cond]
# array([ 3, 4, 5, 6, 7, 8, 9, 10])
cond = ( arr > 5) | (arr == 5)
arr[cond]
# array([ 5, 6, 7, 8, 9, 10, 11, 12])
arr
# array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,
# 13., 14., 15., 16., 17., 18., 19.], dtype=float32)
# np.any: 조건에 참이 하나라도 있으면, True
np.any(arr > 10)
# True
# np.all: 조건이 모두 참이면, True
np.all(arr >= 1)
# False
arr
# array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,
# 13., 14., 15., 16., 17., 18., 19.], dtype=float32)
# np.where(조건, 참인 경우, 거짓 경우)
np.where(arr>5, 1, 0)
# array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
Python
복사
np.clip(array, min, max)
•
배열의 요소가 min보다 작으면 min으로 변경
•
배열의 요소가 max보다 크면 max로 변경
arr
# array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,
# 13., 14., 15., 16., 17., 18., 19.], dtype=float32)
np.clip(arr, 5, 8)
# array([5., 5., 5., 5., 5., 5., 6., 7., 8., 8., 8., 8., 8., 8., 8., 8., 8.,
# 8., 8., 8.], dtype=float32)
Python
복사
np.is~~: 조건문
arr = np.array([np.inf, np.nan, 3,4,5,np.nan,6,7])
arr
# array([inf, nan, 3., 4., 5., nan, 6., 7.])
Python
복사
np.inf: 무한
is_inf = np.isinf(arr)
np.any(is_inf), np.all(is_inf)
# (False, False)
Python
복사
np.nan: 결측치
is_nan = np.isnan(arr)
np.any(is_nan), np.all(is_nan)
# (False, False)
Python
복사
•
np.isinf(arr)
◦
배열 arr의 각 요소가 양의 무한대(inf) 또는 음의 무한대(inf)인지 확인
◦
무한대인 요소는 True, 아닌 요소는 False로 표시되는 동일한 모양의 불리언 배열을 반환
is_inf = np.isinf(arr)
is_inf
# array([ True, False, False, False, False, False, False, False])
Python
복사
•
np.any(is_inf), np.all(is_inf)
◦
np.any(is_inf): 배열 is_inf에 True 값이 하나라도 있으면 True를 반환
▪
즉, arr에 무한대 값이 하나라도 있으면 True
◦
np.all(is_inf): 배열 is_inf의 모든 값이 True일 때만 True를 반환
▪
즉, arr의 모든 값이 무한대일 경우 True
is_inf = np.isinf(arr)
np.any(is_inf), np.all(is_inf)
# (True, False)
Python
복사
•
np.isnan(arr)
◦
배열 arr의 각 요소가 NaN(Not a Number, 숫자가 아님)인지 확인
◦
NaN인 요소는 True, 아닌 요소는 False로 표시되는 동일한 모양의 불리언 배열을 반환
is_nan = np.isnan(arr)
np.any(is_nan), np.all(is_nan)
# (True, False)
Python
복사
•
np.isfinite(arr)
◦
배열 arr의 각 요소가 정상적인 유한 수인지(무한대 또는 NaN이 아닌지) 확인
◦
유한 수는 True, 무한대 또는 NaN인 경우는 False로 표시되는 동일한 모양의 불리언 배열을 반환
np.isfinite(arr) # 셀수 있는 정상 수치 찾기
# array([False, False, True, True, True, False, True, True])
arr[np.isfinite(arr) == False]
# array([inf, nan, nan])
arr[np.isfinite(arr) == False] = 0
arr
# array([0., 0., 3., 4., 5., 0., 6., 7.])
arr[np.isfinite(arr) == False] = 0 # 무한 & nan값을 0으로 변경
arr
# array([0., 0., 3., 4., 5., 0., 6., 7.])
Python
복사
배열의 데이터 소유권 확인 및 복사 (깊은 복사, 얕은 복사)
ndarray.base
•
메모리가 다른 객체에서 온(참조된) 경우 기본 객체를 반환
•
해당 메모리가 현재 객체의 메모리일 경우 None을 반환
ndarray.copy()
arr = np.array([1, 2, 3, 4, 5])
a = arr.copy()
print(a.base) #copy 내에는 데이터가 있음 -> 데이터를 소유하고 있음
# None
Python
복사
ndarray.view()
arr = np.array([1, 2, 3, 4, 5])
b = arr.view()
print(b.base) #copy 내에는 데이터가 없음 -> 데이터를 소유하지 않음(참조)
# [1, 2, 3, 4, 5]
Python
복사
특수한 배열의 생성
np.arange() : 연속 배열
•
사용법
arr = np.arange([시작], 종료, [간격])
Python
복사
•
1씩 증가하는 1차원 배열(시작이 0부터)
arr = np.arange(10) # 1씩 증가하는 1차원 배열(시작이 0부터)
arr
Python
복사
•
1씩 증가하는 1차원 배열(시작이 5부터)
np.arange(5, 10) # 1씩 증가하는 1차원 배열(시작이 5부터)
Python
복사
np.random.default_rng(), np.floor() : 랜덤 배열
rg = np.random.default_rng(1) # create instance of default random number generator
np.floor(10* rg.random((2,2))) # 랜덤 배열 생성
#array([[3., 7.], [3., 4.]])
Python
복사
np.zeros() : 영행렬 배열 생성
•
사용법
np.zeros((행 수, 열 수))
Python
복사
•
5행 3열 배열 생성
np.zeros((5,3)) # 영행렬 생성
Python
복사
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
Python
복사
np.ones() : 유닛행렬 생성
•
사용법
np.ones((행 수, 열 수))
Python
복사
•
2행 3열 배열 생성
np.ones((2,3)) # 유닛행렬 생성
Python
복사
array([[1., 1., 1.],
[1., 1., 1.]])
Python
복사
np.full() : 동스키마 배열 생성
•
사용법
np.full((행 수, 열 수), 스키마 값)
Python
복사
•
2행 3열 원소는 5인 배열 생성
np.full((2,3), 5) # 모든 원소가 5인 2x3행렬
Python
복사
array([[5, 5, 5],
[5, 5, 5]])
Python
복사
np.identity() : 단위 행렬 생성
•
사용법
np.identity(행열 수)
Python
복사
•
3행 3열 배열 생성
np.identity(3) # 유닛행렬 생성
Python
복사
array([[1, 0, 0,]
[0, 1, 0,]
[0, 0, 1,]])
Python
복사
np.eye() : 단위/대각 행렬 생성, 대각선 위치 조정 가능
•
사용법
np.eye(행/열 수, [k=대각선 시작 위치])
Python
복사
•
3행 3열 배열 생성
np.eye(3) # 3x3 단위 행렬
np.eye(3, 4) # 3x4 단위 행렬, 주대각선
np.eye(3, k=1) # 3x3 행렬, 상위 대각선에 1 배치
np.eye(3, k=-1) # 3x3 행렬, 하위 대각선에 1배치
Python
복사
array([[1, 0, 0,]
[0, 1, 0,]
[0, 0, 1,]])
array([[1, 0, 0, 0,]
[0, 1, 0, 0,]
[0, 0, 1, 0,]])
array([[0, 1, 0,]
[0, 0, 1,]
[0, 0, 0,]])
array([[1, 0, 0,]
[0, 0, 0,]
[0, 1, 0,]])
Python
복사
배열 결합
•
np.array 생성
arr1 = np.array([[1, 1],
[2, 2]])
arr2 = np.array([[3, 3],
[4, 4]])
Python
복사
np.vstack()
•
세로(row)로 stack 삽입
arrv = np.vstack((arr1, arr2))
arrv
Python
복사
array([[1, 1],
[2, 2],
[3, 3],
[4, 4]])
Python
복사
np.hstack()
•
가로(column)로 stack 삽입
arrh = np.hstack((arr1, arr2))
arrh
Python
복사
array([[1, 1, 3, 3],
[2, 2, 4, 4]])
Python
복사
배열의 차원 변환
•
배열 생성
arr = np.arange(20)
arr
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
Python
복사
차원 추가
•
np.newaxis()
◦
사용법
# make it as row vector by inserting an axis along first dimension
row_vec = arr[np.newaxis, :]
row_vec.shape
# 결과 : 각각의 숫자에 []가 쓰워지는 것을 볼 수 있다.
# array[[1 2 3 4]]
# make it as column vector by inserting an axis along second dimension
col_vec = arr[:, np.newaxis]
col_vec.shape
# 결과 : 차원이 하나 추가된 것을 볼 수 있다.
# array([[1],
# [2],
# [3],
# [4]])
Python
복사
◦
예제
arr[:, np.newaxis].shape
# (20, 1)
Python
복사
•
np.expand_dims()
◦
사용법
np.expand_dims(arr, axis)
Python
복사
◦
예제
arr1 = np.expand_dims(arr, axis=1)
arr1.shape
(20, 1)
Python
복사
배열 변환
•
array.resize
arr.resize((5,4)) # 5x4행렬
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
Python
복사
•
arr.ravel (데이터 평탄화)
arr.ravel() # returns the array, flattened
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
Python
복사
•
arr.T
arr.T # returns the array, transposed
array([[ 0, 4, 8, 12, 16],
[ 1, 5, 9, 13, 17],
[ 2, 6, 10, 14, 18],
[ 3, 7, 11, 15, 19]])
Python
복사
•
마스킹(masking)
•
Bool 배열을 마스크로 사용하여 데이터의 특정 부분을 선택 가능
lst = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
arr = np.array(lst)
arr.shape
# (3, 3)
mask = [True,False,True] # 해당 조건에 만족하는 행만 추출
arr[:,mask]
# array([[1, 3],
# [4, 6],
# [7, 9]])
mask = arr > 5 # 조건
mask
# array([[False, False, False],
# [False, False, True],
# [ True, True, True]])
arr[mask] # 평탄화
# array([6, 7, 8, 9])
Python
복사
브로드캐스팅(Broadcasting)
•
배열의 모양이 다르더라도 어떠한 조건이 만족했을 때 작은 배열을 자동으로 큰배열 크기에 맞춘다.
arr1 = np.array([1.0, 2.0, 3.0])
arr2 = np.array([2.0, 2.0, 2.0])
arr1 * arr2
# array([2., 4., 6.])
arr1 = np.array([1.0, 2.0, 3.0])
arr1 * 2 # arr1 * arr2와 결과가 같다.
# array([2., 4., 6.])
Python
복사
•
행렬 덧셈
arr1 = np.array([
[ 0.0, 0.0, 0.0],
[10.0, 10.0, 10.0],
[20.0, 20.0, 20.0],
[30.0, 30.0, 30.0]
])
arr2 = np.array([1.0, 2.0, 3.0])
arr1 + arr2
Python
복사
arr1 = np.array([
[ 0.0, 0.0, 0.0],
[10.0, 10.0, 10.0],
[20.0, 20.0, 20.0],
[30.0, 30.0, 30.0]
])
arr2 = np.array([1.0, 2.0, 3.0, 4.0])
arr1 + arr2
Python
복사
•
차원 변환
arr1 = np.array([0.0, 10.0, 20.0, 30.0])
arr2 = np.array([1.0, 2.0, 3.0])
arr1[:, np.newaxis] + arr2
Python
복사