이번 포스팅에서는 파이썬의 과학 처리 패키지인 numpy에 대한 내용과 다루는 방법에 대하여 정리를 해 보았습니다.
# 넘파이는 하나의 데이터 타입만 배열에 넣을 수 있음(dynamic typing 지원하지 않음)
m = np.array([1,2,3,4], float)
print(m)
print(m[2]) #3출력
#실수형변환이 가능한 것은 변환이 되어 배열 생성
a = np.array(['1','2',3,4], float)
print(a)
print(type(a[0]))
a = [1,2,3,4,5]
b = [1,2,3,4,5]
print(a[0] is b[0]) #True
a = np.array(a)
b = np.array(b)
print(a[0] is b[0]) # False
#scalar
t_arr = np.array([1,2,3,4], float)
print(t_arr.dtype) #float64
print(t_arr.shape) #(4,)
#matrix
t_arr = np.array([[1,2,3],[4,5,6]], float)
print(t_arr.shape) #(2,3)
#3-tensor
t_arr = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]], float)
print(t_arr.shape) #(2,2,3)
t_arr = np.array([[1,2,3],[4,5,6],[4,5,6]], float)
print(t_arr.ndim) #2 (2차원)
print(t_arr.size) #9 (데이터의 갯수)
t_arr = np.array([1,2,3,4], dtype = np.float32) # 32비트로 2진수로 표현
print(type(t_arr[0]))
t_arr = np.array([1,2,3,4], dtype = np.float64) # 64비트로 2진수로 표현
print(type(t_arr[0]))
t_arr = np.array([1,2,3,4], dtype = np.int)
print(type(t_arr[0]))
t_arr = np.array([1,2,3,4], dtype = np.float32)
print(t_arr.nbytes) #16 (4*4)
t_arr = np.array([1,2,3,4], dtype = np.float64)
print(t_arr.nbytes) #32 (8*4)
t_arr = np.array([1,2,3,4], dtype = np.int8)
print(t_arr.nbytes) #4 (1*4)
t_arr = np.array([1], dtype = np.int8) #얼마만큼 메모리 사용하고 있는지(int8은 1바이트)
print(t_arr.nbytes) #1 (1*1)
C언어의 자료형과 호환 가능
t_matrix = [[1, 2, 3], [4,5,6]]
np.array(t_matrix).shape
np.array(t_matrix).reshape(3, 2) # 형변환 가능
#-1 : size 기반으로 크기를 알아서 선정해서 reshape해준다.
t_matrix = [[1, 2, 3], [4,5,6]]
print(np.array(t_matrix).reshape(-1, 2)) # 자체 내용이 바뀌지는 않고 return
print("=============")
print(np.array(t_matrix).reshape(3,-1))
print("=============")
print(test_matrix)
t_matrix = [[1, 2, 3,4], [5,6,7,8]]
print("=============")
print(np.array(t_matrix).reshape(1,-1,2))
print(np.array(t_matrix).reshape(1,-1,2).shape)
test_matrix = np.array([[1, 2, 3,4], [5,6,7,8]])
print(test_matrix.flatten()) #[1 2 3 4 5 6 7 8]
print(test_matrix.flatten().shape) #(8,)
print(test_matrix.flatten().size) #8
a = np.array([[1,2,3], [4.1,5.1,6.1]], int)
print(a[0,0]) # 1
print(a[0][0]) # 1
# ndarray 값 변환 가능
a[0,0] = 11
a = np.array([[1,2,3], [4,5,6]], int)
print(a[:,2:])
print("===========")
print(a[:,-1]) #마지막 행 추출
print("===========")
print(a[1,1:3])
print("===========")
print(a[1:3])
print(np.arange(10))
print(np.arange(0,10,0.6))
print(np.arange(10).reshape(2,5))
print(np.zeros(shape=(10,),dtype = np.int8))
print(np.zeros((2,5)))
print(np.ones(shape = (10,), dtype = np.int8))
print(np.ones((2,5)))
print(np.empty(shape=(20,), dtype=np.int8))
print(np.empty((5, 5)))
t_matrix = np.arange(30).reshape(5,6)
print(np.ones_like(t_matrix,float))
print(np.zeros_like(t_matrix,float))
print(np.ones_like(t_matrix,int))
print(np.zeros_like(t_matrix,int))
np.identity(n=3, dtype=np.int8)
np.identity(4)
print(np.eye(3))
print(np.eye(3,5,k=2))#k는 1의 시작 행을 정함
print(np.eye(N=3, M=5, dtype = np.int8))
m = np.arange(9).reshape(3,3)
print(m)
print("========")
print(np.diag(m))
print(m)
print("========")
np.diag(m, k =1)
print(m)
print("========")
np.diag(m, k =0)
print(m)
print("========")
np.diag(m, k =-1)
random sampling
uniform : 균등분포에 따른 난수 생성
normal : 정규분포에 따른 난수 생성
exponential :지수분포에 따른 난수 생성
np.random.uniform(0,1,10).reshape(3,2) #균등분포
np.random.normal(0,1,6).reshape(3,2) # 정규분포
np.random.exponential(scale = 3, size = 10) #지수분포
a = np.arange(11)
print(a.sum())
print(a.sum(dtype = np.float64))
matrix경우
axis = 0 : 행 기준
axis = 1 : 열 기준
a = np.arange(1,11).reshape(2,5)
print(a)
print(a.sum(axis = 0))
print(a.sum(axis = 1))
tensor의 경우
a = np.arange(1,21).reshape(2,5,2)
print(a)
print(a.sum(axis = 0)) #(5,2)
print("=========")
print(a.sum(axis = 1)) #(2,2)
print("=========")
print(a.sum(axis = 2)) #(2,5)
개인적인 tip
만약 3-tensor shape가 (a,b,c) 라고 하면 aixs= 0이면 a를 제거한 (b,c)모양, aixs= 1이면 b를 제거한 (a,c)모양, aixs= 2이면 c를 제거한 (a,b)모양이 되어야 한다. matrix도 마찬가지로 shape가 (a,b) 라고 하면 aixs= 0이면 a를 제거한 (b,)모양, aixs= 1이면 b를 제거한 (a,)모양이 되어야 한다.
m = np.arange(10).reshape(2,5)
print(m)
print(m.mean())
print("==========")
print(m.mean(axis= 0))
print("==========")
print(m.mean(axis= 1))
print(m.std())
print("==========")
print(m.std(axis= 0))
print("==========")
print(m.std(axis= 1))
print(np.sqrt(m))
print("==========")
print(np.exp(m)) #e^m
a = np.array([1,2,3])
b = np.array([2,3,4])
np.vstack((a,b)) #위에서 아래로 쌓임
a = np.array([[1],[2],[3]])
b = np.array([[2],[3],[4]])
np.hstack((a,b)) #왼쪽에서 오른쪽으로 쌓임
concatenate를 axis 기준으로 행렬들을 합칠 수 있다.
a = np.array([[1,2,3]])
b = np.array([[2,3,4]])
np.concatenate((a,b),axis = 0)
a = np.array([[1,2,3]])
b = np.array([[2,3,4]])
np.concatenate((a,b),axis = 1)
a = np.array([[1,2], [3,4]])
b = np.array([[5,6]])
np.concatenate((a,b.T),axis = 1)
a = np.array([[1,2], [3,4]])
b = np.array([5,6])
#축을 추가하는 2방법
#1, b.reshape(-1,2)
#2, b = b[np.newaxis,:]
b = b[np.newaxis,:]
np.concatenate((a,b.T),axis = 1)
a = np.array([[1,2,3], [4,5,6]], float)
b = np.array([[1,2,3], [4,5,6]], float)
print(a + b)
print(a - b)
print(a * b)
a = np.array([[1,2,3], [4,5,6]], float)
b = np.array([[1,2], [4,5],[5,6]], float)
print(a.dot(b))
print(a @ b)
a = np.arange(10).reshape(2,5)
print(a)
print("=========")
print(a.T)
a = np.arange(20).reshape(2,5,2)
print(a)
print("=========")
print(a.T)
m = np.array([[1,2,3], [4,5,6]], float)
scalar = 2
print(m + scalar)
print("============")
print(m - scalar)
print("============")
print(m * scalar)
print("============")
print(m / scalar)
a = np.array([[1,2,3], [4,5,6], [7,8,9]],int)
b = np.array([10,11,12], int)
print(a + b)
print("============")
print(a - b)
print("============")
print(a * b)
print("============")
print(a / b)
%timeit [scalar * value for value in range(1000000)]
%timeit np.arange(1000000) * scalar
a = np.arange(10)
# array([ True, True, True, True, False, False, False, False, False,
# False])
a < 4
# array([ True, False, False, False, False, False, False, False, False,
# False])
a < 1
np.all(a < 10) #True
np.all(a < 5) # False
np.any(a < 5) # True
np.any(a > 11) # False
a = np.array([1,2,3], float)
b = np.array([4,5,-1], float)
# array([False, False, True])
a > b
print((a > b).any()) # True
print((a > b).all()) # False
a = np.array([1,2,3], float)
# array([ True, True, False])
np.logical_and(a>0,a<3)
a = np.array([True,False,False], float)
# array([False, True, True])
np.logical_not(a)
c = np.array([False,False,True], float)
# array([ True, False, True])
np.logical_or(a,c)
a = np.array([1,2,3], float)
# array([2, 2, 3]) <조건에 맞는 값 반환>
np.where(a>2,3,2)
a = np.arange(10)
# (array([6, 7, 8, 9]),) <인덱스 반환>
np.where(a>5)
a = np.array([1,np.NaN,np.Inf], float)
# array([False, True, False])
np.isnan(a)# Not a Number
# array([ True, False, False])
np.isfinite(a) # is finite number(유한한 수인가? , 머신러닝 할 경우 발산하는 값을 걸러낼 때 주로 사용)
a = np.array([1,2,3,4,5,6,7,8,9])
print(np.argmax(a)) # 8
print(np.argmin(a)) # 0
a = np.array([[1,7,32],[43,1,4]])
print(np.argmax(a,axis = 1)) # [2 0]
print(np.argmin(a,axis = 0)) # [0 1 1]
a = np.array([1,2,5,6,7,8,9,4,2,1])
# array([0, 9, 1, 8, 7, 2, 3, 4, 5, 6])
a.argsort()
a = np.array([1,2,5,6,7,8,9,4,2,1])
# array([False, False, True, True, True, True, True, True, False,
# False])
a > 3
condition = a < 3 #조건은 판단하는 ndarray shape와 동일
a[condition] # array([1, 2, 2, 1])
a = np.array([2,4,6,8],float)
b = np.array([0,0,1,3,2,1],int) # 반드시 integer로 선언(shape이 같은 필요는 없음)
a[b] #array([2., 2., 4., 8., 6., 4.])
a.take(b) #take 함수 : fancy index와 같은 효과
a = np.array([[1,2], [3,4]], float)
b = np.array([0,1,1,1,0], int)
c = np.array([0,1,1,0,1], int)
print(a)
print("=========")
print(a[b,c])
print("=========")
print(a[b])
Naver BoostCamp AI Tech - edwith 강의
https://m.blog.naver.com/PostView.nhn?blogId=acornedu&logNo=220934409189&proxyReferer=https:%2F%2Fwww.google.com%2F
https://checkwhoiam.tistory.com/94
https://codetorial.net/articles/exponential_distribution.html