Search

numpy

대분류
라이브러리
소분류
Python Module
유형
수치계산
벡터
행렬
배열
마스킹
브로드캐스팅
모듈 분류
외장
최종 편집 일시
2024/11/04 10:57
생성 일시
2024/07/15 08:30
14 more properties

설명

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
복사
arr.reshape(변경할 배열, 차원) | 배열.reshape(차원)
대각 뒤집기

마스킹(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
복사