1) Numerical Python의 약자
2) 고성능 과학 계산용 패키지로 강력한 N차원 배열 객체
3) 범용적 데이터 처리에 사용 가능한 다차원 컨테이너
4) 정교한 브로드캐스팅(braodcasting)
기능
5) 파이썬의 자료형 list
와 비슷하지만, 더 빠르고 메모리를 효율적으로 관리
6) 반복문 없이 데이터 배열에 대한 처리를 지원하여 빠르게 편리
7) 데이터 과학 도구에 대한 생태계의 핵심을 이루고 있다.
import numpy as np np.__version__ #1.23.5
a1 = np.array([1,2,3,4,5]) print(a1) print(type(a1)) print(a1.shape) print(a1[0], a1[1], a1[2], a1[3], a1[4]) a1[0] = 4 a1[1] = 5 a1[2] = 6 print(a1) #[1 2 3 4 5] #<class 'numpy.ndarray'> #(5,) #1 2 3 4 5 #[4 5 6 4 5]
a2 = np.array([[1,2,3], [4,5,6], [7,8,9]]) print(a2) print(a2.shape) print(a2[0,0], a2[1,1], a2[2,2]) #[[1 2 3] #[4 5 6] #[7 8 9]] #(3, 3) #1 5 9
a3 = np.array([ [ [1, 2, 3], [4, 5, 6], [7, 8, 9]], [ [1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9] ] ]) print(a3) print(a3.shape) #[[[1 2 3] # [4 5 6] # [7 8 9]] # [[1 2 3] # [4 5 6] # [7 8 9]] # [[1 2 3] # [4 5 6] # [7 8 9]]] #(3, 3, 3)
zeros()
: 모든 요소를 0으로 초기화
np.zeros(10) #array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
ones()
: 모든 요소를 1로 초기화
np.ones((3,3)) # array([[1., 1., 1.], # [1., 1., 1.], # [1., 1., 1.]])
full()
: 모든 요소를 지정한 값으로 초기화
np.full((3,3), 1.23) #array([[1.23, 1.23, 1.23], #1.23, 1.23, 1.23], #[1.23, 1.23, 1.23]])
eye()
: 단위행렬(identity matrix) 생성
주 대각선의 원소가 모두 1이고 나머지 원소는 모두 0인 정사각 행렬
np.eye(3) #array([[1., 0., 0.], # [0., 1., 0.], # [0., 0., 1.]])
tri()
: 삼각행렬 생성
np.tri(3) #array([[1., 0., 0.], #[1., 1., 0.], #[1., 1., 1.]])
empty()
: 초기화되지 않은 배열 생성
초기화가 없어서 배열 생성 비용이 저렴하고 빠르다
초기화되지 않아서 기존 메모리 위치에 존재하는 값이 있다.
np.empty(10) #array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
_like()
: 지정한 배열과 shape가 같은 행렬 생성
np.zeros_like()
np.ones_like()
np.full_like()
np.empty_like()
print(a1) np.zeros_like(a1) #[4 5 6 4 5] #array([0, 0, 0, 0, 0])
print(a2) np.ones_like(a2) #[[1 2 3] # [4 5 6] # [7 8 9]] #array([[1, 1, 1], # [1, 1, 1], # [1, 1, 1]])
print(a3) np.full_like(a3, 10) #[[[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]]] #array([[[10, 10, 10], # [10, 10, 10], # [10, 10, 10]], # # [[10, 10, 10], # [10, 10, 10], # [10, 10, 10]], # # [[10, 10, 10], # [10, 10, 10], # [10, 10, 10]]])
arange()
: 정수 범위로 배열 생성
np.arange(0,30,2) #array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
linspace
: 범위 내에서 균등 간격의 배열 생성
np.linspace(0,1,5) #array([0. , 0.25, 0.5 , 0.75, 1. ])
logspace()
: 범위 내에서 균등 간격으로 로그 스케일로 배열 생성
np.logspace(0.1, 1, 20) #array([ 1.25892541, 1.40400425, 1.565802 , 1.74624535, #1.94748304, # 2.1719114 , #2.42220294, 2.70133812, #3.0126409 , 3.35981829, # 3.74700446, #4.17881006, 4.66037703, #5.19743987, 5.79639395, # 6.46437163, 7.2093272 , 8.04013161, 8.9666781 , 10. ])
seed
: 난수 발생을 위한 시드(seed) 지정
permutation
: 순서를 임의로 바꾸거나 임의의 순열 반환
shuffle
: 리스트나 배열의 순서를 뒤섞임
random
: 랜덤한 수의 배열 생성
rand
: 균등 분포에서 표본 추출
randint
: 주어진 최소/최대 범위의 난수 추출
randn
: 표준편차 1, 평균값이 0인 정규분포의 표본추출
binomial
: 이항분포에서 표본 추출
normal
: 정규분포(가우시안)에서 표본 추출
beta
: 베타분포에서 표본 추출
chisquare
: 카이제곱분포에서 표본 추출
gamma
: 감마분포에서 표본 추출
uniform
: 균등(0,1) 분포에서 표본 추출
random.random()
: 랜덤한 수의 배열 생성
np.random.random((3,3)) #array([[0.97362438, 0.79071331, 0.7541677 ], # [0.07039216, 0.22119432, 0.07174502], # [0.88198976, 0.69561844, 0.50031773]])
random.randint()
: 일정 구간의 랜덤 정수의 배열 생성
np.random.randint(0,10,(3,3)) #array([[5, 8, 9], # [7, 6, 6], # [8, 9, 1]])
random.normal()
: 정규분포(noraml distribution)를 고려한 랜덤한 수의 배열 생성
평균 = 0, 표준편차 = 1, 3X3 배열
np.random.normal(0,1,size=(3,3)) #array([[ 1.05738708, -0.27564867, 0.08636845], # [ 0.01450482, -0.82758042, -0.7823833 ], # [ 1.28356991, -0.50697408, -0.13174434]])
random.rand()
: 균등 분포(uniform distribution)를 고려한 랜덤한 수의 배열 생성
np.random.rand(3,3) #array([[0.89933411, 0.81755712, 0.18663516], # [0.1055646 , 0.91110735, 0.3826107 ], # [0.80153325, 0.84635329, 0.0590714 ]])
random.randn()
: 표준 정규 분포(standard normal distribution)를 고려한 랜덤한 수의 배열 생성
np.random.randn(3,3) #array([[-0.22559865, 1.71736471, -1.16924287], # [ 0.5989845 , -0.10458543, -0.06512013], # [ 0.4061729 , 1.16729747, -0.17396654]])
bool_
: 바이트로 저장된불리언(Boolean)
으로 True 또는 False 값을 가진다.
int_
: 기본정수(Integer)
타입
intc
: C언어에서 사용되는int
와 동일(일반적으로int32
또는int64
intp
: 인덱싱에서 사용되는 정수 (C 언어에서ssize_t
와 동일, 일반적으로int32
또는int64
int8
: 바이트(Byte) (-128~127)
int16
: 정수(-32768~32767)
int32
: 정수(-2147483648 ~ 2147483647)
int64
: 정수(-922337203910~922...)
uint8
: 부호 없는 정수(0~255)
uint16
: 부호 없는 정수(0~65535)
uint32
: 부호 없는 정수(0~4294967...)
unit64
: 부호 없는 정수(0~184467440737...)
float16
: 반정밀 부동 소수점(Half precision float) : 부호 비트, 5비트, 10비트 가수
float32
: 단정밀 부동 소수점(Single precision float) : 부호 비트, 8비트 지수, 23비트 가수
float64
: 배정밀 부동 소수점(Double precision float) : 부호 비트, 11비트 지수, 52비트 가수
float_
:float64
를 줄여서 표현
complex64
: 복소수(Complex number), 두 개의 32비트 부동 소수점으로 표현
complex128
: 복소수, 두 개의 64비트 부동 소수점으로 표현
complex_
:complex128
를 줄여서 표현
np.zeros(20, dtype=int) # array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.ones((3,3), dtype=bool) #array([[ True, True, True], # [ True, True, True], # [ True, True, True]])
np.full((3,3), 1.0, dtype=float) #array([[1., 1., 1.], # [1., 1., 1.], # [1., 1., 1.]])
Y
: 연
M
: 월
W
: 주
D
: 일
h
: 시
m
: 분
s
: 초
ms
: 밀리초
ns
: 나노초
ps
: 피코초
fs
: 팸토초
as
: 아토초
date = np.array('2023-12-28', dtype=np.datetime64) date # array('2023-12-28', dtype='datetime64[D]')
date + np.arange(12) #array(['2023-12-28', '2023-12-29', '2023-12-30', '2023-12-31', # '2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', # '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08'], # dtype='datetime64[D]')
datetime = np.datetime64('2024-01-15 13:00') datetime # numpy.datetime64('2024-01-15T13:00')
datetime = np.datetime64('2021-04-23 12:00:12.34', 'ns') datetime # numpy.datetime64('2021-04-23T12:00:12.340000000')
def array_info(array): print(array) print("ndim", array.ndim) print("shape", array.shape) print("dtype", array.dtype) print("size", array.size) print("itemsize", array.itemsize) print("nbytes", array.nbytes) print("strides", array.strides)
array_info(a1) #[4 5 6 4 5] #ndim 1 #shape (5,) #dtype int64 #size 5 #itemsize 8 #nbytes 40 #strides (8,)
array_info(a2) #[[1 2 3] # [4 5 6] # [7 8 9]] #ndim 2 #shape (3, 3) #dtype int64 #size 9 #itemsize 8 #nbytes 72 #strides (24, 8)
array_info(a3) #[[[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]]] #ndim 3 #shape (3, 3, 3) #dtype int64 #size 27 #itemsize 8 #nbytes 216 #strides (72, 24, 8)
print(a1) print(a1[0]) print(a1[2]) print(a1[-1]) print(a1[-2]) #[4 5 6 4 5] #4 #6 #5 #4
print(a2) print(a2[0,0]) print(a2[0,2]) print(a2[1,1]) print(a2[2,-1]) #[[1 2 3] #[4 5 6] #[7 8 9]] #1 #3 #5 #9
print(a3) print(a3[0,0,0]) print(a3[1,1,1]) print(a3[2,2,2]) print(a3[2,-1,-1]) #[[[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]]] #1 #5 #9 #9
slicing
슬라이싱 구문 : a[start:stop:stop]
기본값 : start=0, stop=ndim, step=1
print(a1) print(a1[0:2]) print(a1[0:]) print(a1[:1]) print(a1[::2]) print(a1[::-1]) #[4 5 6 4 5] #[4 5] #[4 5 6 4 5] #[4] #[4 6 5] #[5 4 6 5 4]
print(a2) print(a2[1]) print(a2[1, :]) print(a2[:2, :2]) print(a2[1:, ::-1]) print(a2[::-1, ::-1]) #[[1 2 3] # [4 5 6] # [7 8 9]] #[4 5 6] #[4 5 6] #[[1 2] # [4 5]] #[[6 5 4] # [9 8 7]] #[[9 8 7] # [6 5 4] # [3 2 1]]
불리언 인덱싱(Boolean Indexing)
배열 각 요소의 선택 여부를 불리언(True or False)
로 지정
True 값
인 인덱스의 값만 조회
print(a1) bi = [False, True, True, False, True] print(a1[bi]) bi = [True, False, True, True, False] print(a1[bi]) #[4 5 6 4 5] #[5 6 5] #[4 6 4]
print(a2) bi = np.random.randint(0,2, (3,3), dtype=bool) print(bi) print(a2[bi]) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[False False False] # [False True True] # [False True True]] #[5 6 8 9]
팬시 인덱싱(Fancy Indexing)
print(a1) print(a1[0], a1[2]) ind = [0,2] print(a1[ind]) ind = np.array([[0,1], [2,0]]) print(a1[ind]) #[4 5 6 4 5] #4 6 #[4 6] #[[4 5] # [6 4]]
print(a2) row = np.array([0,2]) col = np.array([1,2]) print(a2[row, col]) print(a2[row, :]) print(a2[:, col]) print(a2[row,1]) print(a2[2,col]) print(a2[row, 1:]) print(a2[1:, col]) #[[1 2 3] # [4 5 6] # [7 8 9]] #[2 9] #[[1 2 3] # [7 8 9]] #[[2 3] # [5 6] # [8 9]] #[2 8] #[8 9] #[[2 3] # [8 9]] #[[5 6] # [8 9]]
insert()
: 배열의 특정 위치에 값 삽입
axis
를 지정하지 않으면 1차원 배열로 변환
추가할 방향을 axis
로 지정
원본 배열 변경없이 새로운 배열 반환
print(a1) b1 = np.insert(a1, 0, 10) print(b1) print(a1) c1 = np.insert(a1, 2, 10) print(c1) #[4 5 6 4 5] #[10 4 5 6 4 5] #[4 5 6 4 5] #[ 4 5 10 6 4 5]
print(a2) b2 = np.insert(a2, 1, 10, axis=0) print(b2) c2 = np.insert(a2, 1, 10, axis=1) print(c2) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[ 1 2 3] # [10 10 10] # [ 4 5 6] # [ 7 8 9]] #[[ 1 10 2 3] # [ 4 10 5 6] # [ 7 10 8 9]]
배열의 인덱싱으로 접근하여 값 수정
print(a1) a1[0] = 1 a1[1] = 2 a1[2] = 3 print(a1) a1[:1] = 9 print(a1) i = np.array([1,3,4]) a1[i] = 0 print(a1) a1[i] += 4 print(a1) #[9 2 3 4 5] #[1 2 3 4 5] #[9 2 3 4 5] #[9 0 3 0 0] #[9 4 3 4 4]
print(a2) a2[0,0] = 1 a2[1,1] = 2 a2[2,2] = 3 a2[0] = 1 print(a2) a2[1:, 2] = 9 print(a2) row = np.array([0,1]) col = np.array([1,2]) a2[row, col] = 0 print(a2) #[[1 1 1] # [4 2 9] # [7 8 9]] #[[1 1 1] # [4 2 9] # [7 8 3]] #[[1 1 1] # [4 2 9] # [7 8 9]] #[[1 0 1] # [4 2 0] #[7 8 9]]
delete()
: 배열의 특정 위치에 값 삭제
axis
를 지정하지 않으면 1차원 배열로 반환
삭제할 방향을 axis
로 지정
원본 배열 변경없이 새로운 배열 반환
print(a1) b1 = np.delete(a1, 1) print(b1) print(a1) #[9 4 3 4 4] #[9 3 4 4] #[9 4 3 4 4]
print(a2) b2 = np.delete(a2, 1, axis=0) print(b2) c2 = np.delete(a2, 1, axis=1) print(c2) #[[1 0 1] # [4 2 0] # [7 8 9]] #[[1 0 1] # [7 8 9]] #[[1 1] # [4 0] # [7 9]]
리스트 자료형과 달리 배열의 슬라이스는 복사본이 아니다.
print(a2) print(a2[:2, :2]) a2_sub = a2[:2, :2] print(a2_sub) a2_sub[:,1] = 0 print(a2_sub) print(a2) #[[1 0 1] # [4 2 0] #[7 8 9]] #[[1 0] # [4 2]] #[[1 0] # [4 2]] #[[1 0] # [4 0]] #[[1 0 1] # [4 0 0] # [7 8 9]]
copy
: 배열이나 하위 배열 내의 값을 명시적으로 복사
print(a2) a2_sub_copy = a2[:2, :2].copy() print(a2_sub_copy) a2_sub_copy[:,1] = 1 print(a2_sub_copy) print(a2) #[[1 0 1] # [4 0 0] # [7 8 9]] #[[1 0] # [4 0]] #[[1 1] # [4 1]] #[[1 0 1] # [4 0 0] # [7 8 9]]
print(a2) print(a2.T) #[[1 2 3] # [4 5 6] #[7 8 9]] #[[1 4 7] # [2 5 8] # [3 6 9]]
print(a3) print(a3.T) #[[[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]]] #[[[1 1 1] # [4 4 4] # [7 7 7]] # # [[2 2 2] # [5 5 5] # [8 8 8]] # # [[3 3 3] # [6 6 6] # [9 9 9]]]
print(a2) print(a2.swapaxes(1,0)) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[1 4 7] # [2 5 8] # [3 6 9]]
print(a3) print(a3.swapaxes(0,1)) print(a3.swapaxes(1,2)) #[[[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]] # # [[1 2 3] # [4 5 6] # [7 8 9]]] #[[[1 2 3] # [1 2 3] # [1 2 3]] # # [[4 5 6] # [4 5 6] # [4 5 6]] # # [[7 8 9] # [7 8 9] # [7 8 9]]] #[[[1 4 7] # [2 5 8] # [3 6 9]] # # [[1 4 7] # [2 5 8] # [3 6 9]] # # [[1 4 7] # [2 5 8] # [3 6 9]]]
reshape
: 배열의 형상을 변경
#[1 2 3 4 5 6 7 8 9] #[[1 2 3] # [4 5 6] # [7 8 9]]
newaxis()
: 새로운 축 추가
print(n1) print(n1[np.newaxis, :5]) print(n1[:5, np.newaxis]) #[1 2 3 4 5 6 7 8 9] #[[1 2 3 4 5]] #[[1] # [2] # [3] # [4] # [5]]
n2 = np.random.randint(0,10,(2,5)) print(n2) n2.resize((5,2)) print(n2) #[[0 9 2 2 6] # [0 8 9 3 7]] #[[0 9] # [2 2] # [6 0] # [8 9] # [3 7]]
배열 크기 증가
남은 공간은 0으로 채워진다.
n2 = np.resize(n2, (5, 5)) print(n2) # n2.resize((5,5)) #강의에 쓰던 코드이며 오류가 발생하여 위코드로 사용 # print(n2) #[[0 9 2 2 6] # [0 8 9 3 7] # [0 9 2 2 6] # [0 8 9 3 7] # [0 9 2 2 6]]
배열 크기 감소
포함되지 않은 값은 삭제된다.
n2 = n2.copy() n2.resize((3, 3)) print(n2) # n2.resize((3,3)) #강의에 쓰던 코드이며 오류가 발행하여 위 코드로 사용 # print(n2) #[[0 9 2] # [2 6 0] # [8 9 3]]
append()
: 배열의 끝에 값 추가
a2 = np.arange(1,10).reshape(3,3) print(a2) b2 = np.arange(10,19).reshape(3,3) print(b2) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[10 11 12] # [13 14 15] # [16 17 18]]
axis
지정이 없으면 1차원 배열 형태로 변형되어 결합
c2 = np.append(a2, b2) print(c2) output #[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]
axis
를 0으로 지정
shape[0]
을 제외한 나머지 shape
은 같아야 한다.
c2 = np.append(a2, b2, axis=0) print(c2) #[[ 1 2 3] # [ 4 5 6] # [ 7 8 9] # [10 11 12] # [13 14 15] # [16 17 18]]
axis
를 1로 지정
shape[1]
을 제외한 나머지 shape
은 같아야 한다.
c2 = np.append(a2, b2, axis=1) print(c2) #[[ 1 2 3 10 11 12] # [ 4 5 6 13 14 15] # [ 7 8 9 16 17 18]]
concatenate()
: 튜플이나 배열의 리스트를 인수로 사용해 배열 연결
a1 = np.array([1,3,5]) b1 = np.array([2,4,6]) np.concatenate([a1, b1]) # array([1, 3, 5, 2, 4, 6])
c1 = np.array([7,8,9]) np.concatenate([a1, b1, c1]) # array([1, 3, 5, 2, 4, 6, 7, 8, 9])
a2 = np.array([[1,2,3], [4,5,6]]) np.concatenate([a2, a2]) #array([[1, 2, 3], # [4, 5, 6], # [1, 2, 3], # [4, 5, 6]])
a2 = np.array([[1,2,3], [4,5,6]]) np.concatenate([a2, a2], axis =1) #array([[1, 2, 3, 1, 2, 3], # [4, 5, 6, 4, 5, 6]])
vstack()
: 수직 스택(horizontal stack), 1차원으로 연결
np.vstack([a2, a2]) #array([[1, 2, 3], # [4, 5, 6], # [1, 2, 3], # [4, 5, 6]])
hstack()
: 수평 스택(horizontal stack), 2차원으로 연결
np.hstack([a2, a2]) #array([[1, 2, 3, 1, 2, 3], # [4, 5, 6, 4, 5, 6]])
dstack()
: 깊이 스택(depth stack), 3차원으로 연결
np.dstack([a2, a2]) #array([[[1, 1], # [2, 2], # [3, 3]], # # [[4, 4], # [5, 5], # [6, 6]]])
stack()
: 새로운 차원으로 연결
np.stack([a2, a2]) #array([[[1, 2, 3], # [4, 5, 6]], # # [[1, 2, 3], # [4, 5, 6]]])
split()
: 배열 분할
a1 = np.arange(0,10) print(a1) b1, c1 = np.split(a1, [5]) print(b1,c1) b1, c1, d1, e1, f1 =np.split(a1, [2,4,6,8]) print(b1, c1, d1, e1, f1) #[0 1 2 3 4 5 6 7 8 9] #[0 1 2 3 4] [5 6 7 8 9] #[0 1] [2 3] [4 5] [6 7] [8 9]
vsplit()
: 수직 분할, 1차원으로 분할
a2 = np.arange(1,10).reshape(3,3) print(a2) b2, c2 = np.vsplit(a2, [2]) print(b2) print(c2) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[1 2 3] # [4 5 6]] #[[7 8 9]]
hsplit()
: 수평 분할, 2차원으로 분할
a2 = np.arange(1,10).reshape(3,3) print(a2) b2, c2 = np.hsplit(a2, [2]) print(b2) print(c2) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[1 2] # [4 5] # [7 8]] #[[3] # [6] # [9]]
dsplit()
: 깊이 분할, 3차원으로 분할
a3 = np.arange(1,28).reshape(3,3,3) print(a3) b3, c3 = np.dsplit(a3, [2]) print(b3) print(c3) #[[[ 1 2 3] # [ 4 5 6] # [ 7 8 9]] # # [[10 11 12] # [13 14 15] # [16 17 18]] # # [[19 20 21] # [22 23 24] # [25 26 27]]] #[[[ 1 2] # [ 4 5] # [ 7 8]] # # [[10 11] # [13 14] # [16 17]] # # [[19 20] # [22 23] # [25 26]]] #[[[ 3] # [ 6] # [ 9]] # # [[12] # [15] # [18]] # # [[21] # [24] # [27]]]
NumPy
의 배열 연산은 벡터화(vectorized)
연산을 사용
일반적으로 NumPy의 범용 횟수(universial functions)
을 통해 구현
배열 요소에 대한 반복적인 계산을 효율적으로 수행
import numpy as np a1 = np.array([1,2,3]) print(a1) print(a1+5) # a2 = np.arange(1,10).reshape(3,3) print(a2) print(a1+a2) # b2 = np.array([1,2,3]).reshape(3,1) print(b2) print(a1+b2) #[1 2 3] #[6 7 8] #[[1 2 3] # [4 5 6] # [7 8 9]] #[[ 2 4 6] # [ 5 7 9] # [ 8 10 12]] #[[1] # [2] # [3]] #[[2 3 4] # [3 4 5] # [4 5 6]]
a1 = np.arange(1,10) print(a1) print(a1+1) print(np.add(a1, 10)) print(a1-2) print(np.subtract(a1,10)) print(-a1) print(np.negative(a1)) print(a1 * 2) print(np.multiply(a1, 2)) print(a1/2) print(np.divide(a1,2)) print(a1//2) print(np.floor_divide(a1,2)) print(a1 ** 2) print(np.power(a1,2)) print(np.mod(a1,2)) #[1 2 3 4 5 6 7 8 9] #[ 2 3 4 5 6 7 8 9 10] #[11 12 13 14 15 16 17 18 19] #[-1 0 1 2 3 4 5 6 7] #[-9 -8 -7 -6 -5 -4 -3 -2 -1] #[-1 -2 -3 -4 -5 -6 -7 -8 -9] #[-1 -2 -3 -4 -5 -6 -7 -8 -9] #[ 2 4 6 8 10 12 14 16 18] #[ 2 4 6 8 10 12 14 16 18] #[0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5] #[0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5] #[0 1 1 2 2 3 3 4 4] #[0 1 1 2 2 3 3 4 4] #[ 1 4 9 16 25 36 49 64 81] #[ 1 4 9 16 25 36 49 64 81] #[1 0 1 0 1 0 1 0 1]
a1 = np.arange(1,10) print(a1) b1 = np.random.randint(1,10, size=9) print(b1) print(a1 + b1) print(a1 - b1) print(a1 * b1) print(a1 / b1) print(a1 // b1) print(a1 ** b1) print(a1 % b1) #[1 2 3 4 5 6 7 8 9] #[9 7 2 2 2 2 5 9 1] #[10 9 5 6 7 8 12 17 10] #[-8 -5 1 2 3 4 2 -1 8] #[ 9 14 6 8 10 12 35 72 9] #[0.11111111 0.28571429 1.5 2. 2.5 3. # 1.4 0.88888889 9. ] #[0 0 1 2 2 3 1 0 9] #[ 1 128 9 16 25 36 16807 # 134217728 9] #[1 2 1 0 1 0 2 8 0]
a2 = np.arange(1,10).reshape(3,3) print(a2) b2 = np.random.randint(1,10, size=(3,3)) print(b2) print(a2 + b2) print(a2 - b2) print(a2 * b2) print(a2 / b2) print(a2 // b2) print(a2 ** b2) print(a2 % b2) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[3 8 1] # [1 2 4] # [1 3 2]] #[[ 4 10 4] # [ 5 7 10] # [ 8 11 11]] #[[-2 -6 2] # [ 3 3 2] # [ 6 5 7]] #[[ 3 16 3] # [ 4 10 24] # [ 7 24 18]] #[[0.33333333 0.25 3. ] # [4. 2.5 1.5 ] # [7. 2.66666667 4.5 ]] #[[0 0 3] # [4 2 1] # [7 2 4]] #[[ 1 256 3] # [ 4 25 1296] # [ 7 512 81]] #[[1 2 0] # [0 1 2] # [0 2 1]]
absolute()
, abs()
: 내장된 절대값 함수
a1 = np.random.randint(-10,10, size=5) print(a1) print(np.absolute(a1)) print(np.abs(a1)) #[-5 3 7 8 1] #[5 3 7 8 1] #[5 3 7 8 1]
square
, sqrt
: 제곱, 제곱근 함수
print(a1) print(np.square(a1)) print(np.sqrt(a1)) #[-5 3 7 8 1] #[25 9 49 64 1] #[ nan 1.73205081 2.64575131 2.82842712 1. ] #<ipython-input-14-4e034cb7ea92>:3: RuntimeWarning: invalid value encountered in sqrt # print(np.sqrt(a1))
a1 = np.random.randint(1,10, size=5) print(a1) print(np.exp(a1)) print(np.exp2(a1)) print(np.power(a1,2)) #[6 2 6 1 5] #[403.42879349 7.3890561 403.42879349 2.71828183 148.4131591 ] #[64. 4. 64. 2. 32.] #[36 4 36 1 25]
print(a1) print(np.log(a1)) print(np.log2(a1)) print(np.log10(a1)) #[6 2 6 1 5] #[1.79175947 0.69314718 1.79175947 0. 1.60943791] #[2.5849625 1. 2.5849625 0. 2.32192809] #[0.77815125 0.30103 0.77815125 0. 0.69897 ]
t = np.linspace(0, np.pi, 3) print(t) print(np.sin(t)) print(np.cos(t)) print(np.tan(t)) #[0. 1.57079633 3.14159265] #[0.0000000e+00 1.0000000e+00 1.2246468e-16] #[ 1.000000e+00 6.123234e-17 -1.000000e+00] #[ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
x = [-1, 0, 1] print(x) print(np.arcsin(x)) print(np.arccos(x)) print(np.arctan(x)) #[-1, 0, 1] #[-1.57079633 0. 1.57079633] #[3.14159265 1.57079633 0. ] #[-0.78539816 0. 0.78539816]
a2 = np.random.randint(1, 10, size=(3,3)) print(a2) print(a2.sum(), np.sum(a2)) print(a2.sum(axis=0), np.sum(a2, axis=0)) print(a2.sum(axis=1), np.sum(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #54 54 #[20 8 26] [20 8 26] #[23 19 12] [23 19 12]
print(a2) print(np.cumsum(a2)) print(np.cumsum(a2, axis=0)) print(np.cumsum(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #[ 9 14 23 32 34 42 44 45 54] #[[ 9 5 9] # [18 7 17] # [20 8 26]] #[[ 9 14 23] # [ 9 11 19] # [ 2 3 12]]
print(a2) print(np.diff(a2)) print(np.diff(a2, axis=0)) print(np.diff(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #[[-4 4] # [-7 6] # [-1 8]] #[[ 0 -3 -1] # [-7 -1 1]] #[[-4 4] # [-7 6] # [-1 8]]
print(a2) print(np.prod(a2)) print(np.prod(a2, axis=0)) print(np.prod(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #1049760 #[162 10 648] #[405 144 18]
print(a2) print(np.cumprod(a2)) print(np.cumprod(a2, axis=0)) print(np.cumprod(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #[ 9 45 405 3645 7290 58320 116640 116640 1049760] #[[ 9 5 9] # [ 81 10 72] # [162 10 648]] #[[ 9 45 405] # [ 9 18 144] # [ 2 2 18]]
print(a2) b2 = np.ones_like(a2) print(b2) print(np.dot(a2,b2)) print(np.matmul(a2,b2)) #[[9 5 9] # [9 2 8] # [2 1 9]] #[[1 1 1] # [1 1 1] # [1 1 1]] #[[23 23 23] # [19 19 19] # [12 12 12]] #[[23 23 23] # [19 19 19] # [12 12 12]]
print(a2) print(b2) print(np.tensordot(a2, b2)) print(np.tensordot(a2, b2, axes=0)) print(np.tensordot(a2, b2, axes=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #[[1 1 1] # [1 1 1] # [1 1 1]] #54 #[[[[9 9 9] # [9 9 9] # [9 9 9]] # # [[5 5 5] # [5 5 5] # [5 5 5]] # # [[9 9 9] # [9 9 9] # [9 9 9]]] # # # [[[9 9 9] # [9 9 9] # [9 9 9]] # # [[2 2 2] # [2 2 2] # [2 2 2]] # # [[8 8 8] # [8 8 8] # [8 8 8]]] # # # [[[2 2 2] # [2 2 2] # [2 2 2]] # # [[1 1 1] # [1 1 1] # [1 1 1]] # # [[9 9 9] # [9 9 9] # [9 9 9]]]] #[[23 23 23] # [19 19 19] # [12 12 12]]
x = [1,2,3] y = [4,5,6] print(np.cross(x,y)) #[-3 6 -3]
print(a2) print(b2) print(np.inner(a2,b2)) print(np.outer(a2,b2)) #[[9 5 9] # [9 2 8] # [2 1 9]] #[[1 1 1] # [1 1 1] # [1 1 1]] #[[23 23 23] # [19 19 19] # [12 12 12]] #[[9 9 9 9 9 9 9 9 9] # [5 5 5 5 5 5 5 5 5] # [9 9 9 9 9 9 9 9 9] # [9 9 9 9 9 9 9 9 9] # [2 2 2 2 2 2 2 2 2] # [8 8 8 8 8 8 8 8 8] # [2 2 2 2 2 2 2 2 2] # [1 1 1 1 1 1 1 1 1] # [9 9 9 9 9 9 9 9 9]]
print(a2) print(np.mean(a2)) print(np.mean(a2, axis=0)) print(np.mean(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #6.0 #[6.66666667 2.66666667 8.66666667] #[7.66666667 6.33333333 4. ]
print(a2) print(np.std(a2)) print(np.std(a2, axis=0)) print(np.std(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #3.2998316455372216 #[3.29983165 1.69967317 0.47140452] #[1.88561808 3.09120617 3.55902608]
print(a2) print(np.var(a2)) print(np.var(a2, axis=0)) print(np.var(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #10.88888888888889 #[10.88888889 2.88888889 0.22222222] #[ 3.55555556 9.55555556 12.66666667]
print(a2) print(np.min(a2)) print(np.min(a2, axis=0)) print(np.min(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #1 #[2 1 8] #[5 2 1]
print(a2) print(np.max(a2)) print(np.max(a2, axis=0)) print(np.max(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #9 #[9 5 9] #[9 9 9]
print(a2) print(np.argmin(a2)) print(np.argmin(a2, axis=0)) print(np.argmin(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #7 #[2 2 1] #[1 1 1]
print(a2) print(np.argmax(a2)) print(np.argmax(a2, axis=0)) print(np.argmax(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #0 #[0 0 0] #[0 0 2]
print(a2) print(np.median(a2)) print(np.median(a2, axis=0)) print(np.median(a2, axis=1)) #[[9 5 9] # [9 2 8] # [2 1 9]] #8.0 #[9. 2. 9.] #[9. 8. 2.]
a1 = np.array([0,1,2,3]) print(a1) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='linear')) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='higher')) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='nearest')) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='midpoint')) # a1 = np.array([0,1,2,3]) print(a1) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='linear')) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='higher')) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='nearest')) print(np.percentile(a1, [0,20,40,60,80,100], interpolation='midpoint')) #[0 1 2 3] #[0. 0.6 1.2 1.8 2.4 3. ] #[0 1 2 2 3 3] #[0 1 1 2 2 3] #[0. 0.5 1.5 1.5 2.5 3. ]
a2 = np.array([[False, False, False], [False, True, True], [False, True, True]]) print(a2) print(np.any(a2)) print(np.any(a2, axis=0)) print(np.any(a2, axis=1)) #[[False False False] # [False True True] # [False True True]] #True #[False True True] #[False True True]
a2 = np.array([[False, False, True], [True, True, True], [False, True, True]]) print(a2) print(np.all(a2)) print(np.all(a2, axis=0)) print(np.all(a2, axis=1)) #[[False False True] # [ True True True] # [False True True]] #False #[False False True] #[False True False]
a1 = np.arange(1,10) print(a1) print(a1 == 5) print(a1 != 5) print(a1 < 5) print(a1 <= 5) print(a1 > 5) print(a1 >= 5) #[1 2 3 4 5 6 7 8 9] #[False False False False True False False False False] #[ True True True True False True True True True] #[ True True True True False False False False False] #[ True True True True True False False False False] #[False False False False False True True True True] #[False False False False True True True True True]
a2 = np.arange(1,10).reshape(3,3) print(a2) print(np.sum(a2)) print(np.count_nonzero(a2>5)) print(np.sum(a2 > 5)) print(np.sum(a2 > 5, axis = 0)) print(np.sum(a2 > 5, axis = 1)) print(np.any(a2 > 5)) print(np.any(a2 > 5, axis = 0)) print(np.any(a2 > 5, axis = 1)) print(np.all(a2 > 5)) print(np.all(a2 > 5, axis = 0)) print(np.all(a2 > 5, axis = 1)) #[[1 2 3] # [4 5 6] # [7 8 9]] #45 #4 #4 #[1 1 2] #[0 1 3] #True #[ True True True] #[False True True] #False #[False False False] #[False False True]
a1 = np.array([1,2,3,4,5]) print(a1) a2 = np.array([1,2,3,3,4]) print(a2) print(np.isclose(a1, a2)) #[1 2 3 4 5] #[1 2 3 3 4] #[ True True True False False]
a1 = np.array([np.nan, 2, np.inf, 4, np.NINF]) print(a1) print(np.isnan(a1)) print(np.isinf(a1)) print(np.isfinite(a1)) #[ nan 2. inf 4. -inf] #[ True False False False False] #[False False True False True] #[False True False True False]
a2 = np.arange(1,10).reshape(3,3) print(a2) # print((a2 > 5) & (a2 < 8)) print(a2[(a2 > 5) & (a2 < 8)]) # print((a2 > 5) | (a2 < 8)) print(a2[(a2 > 5) | (a2 < 8)]) # print((a2 > 5) ^ (a2 < 8)) print(a2[(a2 > 5) ^ (a2 < 8)]) # print(~(a2 > 5)) print(a2[~(a2 > 5)]) #[[1 2 3] # [4 5 6] # [7 8 9]] #[[False False False] # [False False True] # [ True False False]] #[6 7] #[[ True True True] # [ True True True] # [ True True True]] #[1 2 3 4 5 6 7 8 9] #[[ True True True] # [ True True False] # [False True True]] #[1 2 3 4 5 8 9] #[[ True True True] # [ True True False] # [False False False]] #[1 2 3 4 5]
a1 = np.random.randint(1, 10, size=10) print(a1) print(np.sort(a1)) print(a1) print(np.argsort(a1)) print(a1) print(a1.sort()) print(a1) #[3 7 4 1 7 4 6 8 7 5] #[1 3 4 4 5 6 7 7 7 8] #[3 7 4 1 7 4 6 8 7 5] #[3 0 2 5 9 6 1 4 8 7] #[3 7 4 1 7 4 6 8 7 5] #None #[1 3 4 4 5 6 7 7 7 8]
a2 = np.random.randint(1,10,size=(3,3)) print(a2) print(np.sort(a2, axis=0)) print(np.sort(a2, axis=1)) #[[2 7 2] # [6 1 2] # [5 1 7]] #[[2 1 2] # [5 1 2] # [6 7 7]] #[[2 2 7] # [1 2 6] # [1 5 7]]
partition()
: 배열에서 k개의 작은 값을 반환a1 = np.random.randint(1,10,size=10) print(a1) print(np.partition(a1,3)) #[1 6 6 4 5 6 7 2 3 5] #[1 2 3 4 5 6 7 6 6 5]
a2 = np.random.randint(1,10,size=(5,5)) print(a2) print(np.partition(a2, 3)) print(np.partition(a2, 3, axis=0)) print(np.partition(a2, 3, axis=1)) #[[8 2 3 5 6] # [6 9 2 5 8] # [2 2 4 3 1] # [3 3 8 7 6] # [4 6 9 1 5]] #[[5 3 2 6 8] # [5 2 6 8 9] # [1 2 2 3 4] # [3 3 6 7 8] # [1 4 5 6 9]] #[[3 2 2 1 1] # [2 2 3 3 5] # [4 3 4 5 6] # [6 6 8 5 6] # [8 9 9 7 8]] #[[5 3 2 6 8] # [5 2 6 8 9] # [1 2 2 3 4] # [3 3 6 7 8] # [1 4 5 6 9]]
a2 = np.random.randint(1,10,size=(5,5)) print(a2) np.save("a", a2) #[[5 5 6 4 5] # [9 9 8 6 5] # [7 4 9 6 1] # [8 6 3 3 8] # [6 1 9 2 4]]
!ls #a.npy sample_data
b2 = np.random.randint(1,10,size=(5,5)) print(b2) np.savez("ab", a2, b2) #[[9 1 3 7 1] # [8 5 6 1 6] # [4 6 6 5 8] # [4 8 4 7 7] # [9 7 7 7 2]]
!ls #ab.npy ab.npz a.npy sample_data
b2 = np.random.randint(1,10,size=(5,5)) print(b2) np.savez("ab", a2, b2) #[[9 1 3 7 1] # [8 5 6 1 6] # [4 6 6 5 8] # [4 8 4 7 7] # [9 7 7 7 2]]
!ls #ab.npy ab.npz a.npy sample_data
npy = np.load("a.npy") print(npy) #[[5 5 6 4 5] # [9 9 8 6 5] # [7 4 9 6 1] # [8 6 3 3 8] # [6 1 9 2 4]]
npz = np.load("ab.npz") print(npz.files) print(npz['arr_0']) print(npz['arr_1']) #['arr_0', 'arr_1'] #[[5 5 6 4 5] # [9 9 8 6 5] # [7 4 9 6 1] # [8 6 3 3 8] # [6 1 9 2 4]] #[[9 1 3 7 1] # [8 5 6 1 6] # [4 6 6 5 8] # [4 8 4 7 7] # [9 7 7 7 2]]
print(a2) np.savetxt("a.csv", a2, delimiter=',') #[[5 5 6 4 5] # [9 9 8 6 5] # [7 4 9 6 1] # [8 6 3 3 8] # [6 1 9 2 4]]
!ls #ab.npy ab.npz a.csv a.npy sample_data
!cat a.csv #5.000000000000000000e+00,5.000000000000000000e+00,6.000000000000000000e+00,4.000000000000000000e+00,5.000000000000000000e+00 #9.000000000000000000e+00,9.000000000000000000e+00,8.000000000000000000e+00,6.000000000000000000e+00,5.000000000000000000e+00 #7.000000000000000000e+00,4.000000000000000000e+00,9.000000000000000000e+00,6.000000000000000000e+00,1.000000000000000000e+00 #8.000000000000000000e+00,6.000000000000000000e+00,3.000000000000000000e+00,3.000000000000000000e+00,8.000000000000000000e+00 #6.000000000000000000e+00,1.000000000000000000e+00,9.000000000000000000e+00,2.000000000000000000e+00,4.000000000000000000e+00
csv = np.loadtxt("a.csv", delimiter=',') print(csv) #[[5. 5. 6. 4. 5.] # [9. 9. 8. 6. 5.] # [7. 4. 9. 6. 1.] # [8. 6. 3. 3. 8.] # [6. 1. 9. 2. 4.]]
print(b2) np.savetxt("b.csv", b2, delimiter=',', fmt='%.2e', header='c1, c2, c3, c4') #[[9 1 3 7 1] # [8 5 6 1 6] # [4 6 6 5 8] # [4 8 4 7 7] # [9 7 7 7 2]]
!cat b.csv # c1, c2, c3, c4 #9.00e+00,1.00e+00,3.00e+00,7.00e+00,1.00e+00 #8.00e+00,5.00e+00,6.00e+00,1.00e+00,6.00e+00 #4.00e+00,6.00e+00,6.00e+00,5.00e+00,8.00e+00 #4.00e+00,8.00e+00,4.00e+00,7.00e+00,7.00e+00 #9.00e+00,7.00e+00,7.00e+00,7.00e+00,2.00e+00
csv = np.loadtxt("b.csv", delimiter=',') print(csv) #[[9. 1. 3. 7. 1.] # [8. 5. 6. 1. 6.] # [4. 6. 6. 5. 8.] # [4. 8. 4. 7. 7.] # [9. 7. 7. 7. 2.]]