
1. 앞서 약간 기쁜소식
스마일게이트에서 코딩테스트를 보라고 연락이 왔다!
내 생각엔 아마 이 코딩테스트랑 서류를 같이보는.. 서류전형인듯 하다.
그래도 내 서류를 보고 연락을 준걸까..? 저의 지원서 어떤가요..?
어쨌든 좋은 기회가 왔으니 동기부여가 된다😁
2. 이러닝 주간이라 강의 얼른 듣고 지원서 쓰느라고 벨로그 관리도 소홀했고 코딩도 열심히 안했더니.. 감을 약간 잃어버린듯 하다.. 개발자들이 왜 꾸준히 공부하는 지 알겠음
머신러닝 교육과정을 앞두고 판다스랑 넘파이에 대해서 정리하고자 한다.
사실 이 두 라이브러리 모두 다뤄봤지만..
심지어 인공지능 수업때 열심히 다뤘던 것들이다. 근데 이런것들은 정리 안해두면 금방 까먹음!!
판다스랑 넘파이는 같이 쓰는 경우가 많으니! 넘파이 먼저 정리하고자 한다
Numpy란?import numpy as np
matrix_1 = [[1, 2],[3, 4]]
matrix_2 = [[5, 6],[7, 8]]
이런 형태의 2차원 배열.. 즉 행렬이 있을 때, 넘파이 사용 없이 행렬의 합을 구하고자 한다면 이중포문을 사용해야 한다.
matrix_result = []
for i in range(len(matrix_1)):
tmp = []
for j in range(len(matrix_2)):
tmp.append(matrix_1[i][j]+matrix_2[i][j])
matrix_result.append(tmp)
이렇게!
하지만 Numpy를 이용해 행렬합을 구하고자 한다면 np.array를 사용하여 쉽게 해결할 수 있다.
matrix_result = np.array(matrix_1) + np.array(matrix_2)

참 쉽죠?
한 행렬의 모든 원소에 1을 더하고자 한다.
Numpy를 이용하지 않는다면 마찬가지로 이중포문을 사용하여 각각의 배열의 인덱스에 접근하여 더해줘야 한다.
matrix_1 = [[1, 2],[3, 4]]
for i in range(len(matrix_1)):
for j in range(len(matrix_2)):
matrix_1[i][j] = matrix_1[i][j] + 1
근데 이 역시 넘파이를 이용한다면
matrix_1 = [[1, 2],[3, 4]]
np.array(matrix_1) + 1
너무나도 간단하게 해결할 수 있다!
import time
size = 10000000
#list
x = list(range(size))
y = list(range(size))
start_time = time.time()
z = [x[i]+x[i] for i in range(size)]
print("리스트 걸린시간", time.time()-start_time)
#adlist (넘파이)
x = np.arange(size)
y = np.arange(size)
start_time = time.time()
z = x + y
print("넘파이 걸린시간", time.time()-start_time)
리스트 걸린시간 1.5493590831756592 넘파이 걸린시간 0.07301616668701172
Numpy를 안 쓸 이유가 없다.
ndarrayNumpy의 다차원 행렬자료구조 클래스np.array(data, dtype = np.float32)와 같이 데이터 타입지정도 같이 해줄 수 있다.ndarray
- 행렬구조:
ndarray.shape- 차원 확인:
ndarray.dim- 개수:
ndarray.size
x = np.array(1)
print(x.shape) # ()
print(x.ndim) # 0
print(x.size) # 1
x = np.array([1, 2])
print(x.shape) # (2, )
print(x.ndim) # 1
print(x.size) # 2
x = np.array([[1, 2, 3], [4, 5, 6]])
print(x.shape) # (2, 3)
print(x.ndim) # 2
print(x.size) # 6
numpy 주요 메서드 및 함수 정리np.arange()range와 유사함np.arange(start, end, step)x = np.arange(10)
print(x)
x = np.arange(10.0)
print(x)
x = np.arange(1, 10, 2)
print(x)
x = np.arange(1, 10, 0.5)
print(x)
x = np.arange(10, 1, -0.5)
print(x)
[0 1 2 3 4 5 6 7 8 9] [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] [1 3 5 7 9] [1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5] [10. 9.5 9. 8.5 8. 7.5 7. 6.5 6. 5.5 5. 4.5 4. 3.5 3. 2.5 2. 1.5]
np.linspace()np.linspace(start, end, size)endpoint=False: 끝 값 포함여부 옵션x = np.linspace(1, 20, 10, endpoint=False)
print(x)
[ 1. 2.9 4.8 6.7 8.6 10.5 12.4 14.3 16.2 18.1]
x = np.linspace(1, 20, 10, endpoint=True)
print(x)
[ 1. 3.11111111 5.22222222 7.33333333 9.44444444 11.55555556 13.66666667 15.77777778 17.88888889 20. ]
np.reshape()ndarray.reshape(dim)x = np.arange(9)
다음과 같이 ndarray를 생성했을 때 [0 1 2 3 4 5 6 7 8]인 리스트가 생성된다.
x = np.arange(9).reshape(3, 3)
이렇게 해주면 3*3 행렬로 만들어줌!
[[0 1 2] [3 4 5] [6 7 8]]
x = np.arange(9).reshape(3, -1)
-1을 넣어주면 자동으로 3*3행렬로 만들어준다.
randomnp.random.rand(5,5)
array([[0.78537271, 0.09390253, 0.7100877 , 0.49239082, 0.76433812], [0.3153292 , 0.1477745 , 0.18806045, 0.13771488, 0.39226348], [0.26999992, 0.79353612, 0.62133562, 0.9536003 , 0.43887054], [0.90003483, 0.03766647, 0.08435369, 0.38078857, 0.47093035], [0.8807208 , 0.04898573, 0.35459603, 0.94382534, 0.0284358 ]])
np.random.randint(1, 10) # 1부터 10 사이의 랜덤한 정수 하나 출력
np.random.randint(1, 10, size=(5, 5))
array([[1, 2, 4, 3, 9], [5, 8, 9, 4, 6], [6, 2, 3, 3, 5], [2, 3, 1, 6, 7], [1, 3, 5, 9, 5]])
np.ones([5,5]): 모든 값이 1np.zeros([5,5]): 모든 값이 0np.eye(5): 단위행렬 (행렬곱 시 자기 자신이 나오는)ndarray.ravel(order=‘C’): 행렬 펼치기(행 기준, 'F' = 열 기준)x = np.random.randint(1, 10, size=(5, 5))
print(x)
print(x.ravel())
print(x.ravel(order='F'))
[[7 9 5 5 4] [8 9 2 5 9] [4 5 5 9 6] [7 1 2 1 3] [3 2 3 2 4]] [7 9 5 5 4 8 9 2 5 9 4 5 5 9 6 7 1 2 1 3 3 2 3 2 4] [7 8 4 7 3 9 9 5 1 2 5 2 5 2 3 5 5 9 1 2 4 9 6 3 4]
concatenatex = np.arange(1, 4)
y = np.arange(4, 7)
np.concatenate([x, y])
array([1, 2, 3, 4, 5, 6])
axis=1 열을 기준으로 연결x = np.arange(10).reshape(2, 5)
y = np.arange(10, 20).reshape(2, 5)
print(x)
print(y)
[[0 1 2 3 4] [5 6 7 8 9]] [[10 11 12 13 14] [15 16 17 18 19]]
이렇게 생긴 두 이차원 배열을 concat한다면
np.concatenate([x, y])
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
그냥 concat을 하면 행렬을 밑에 고대로 갖다 붙힘
np.concatenate([x, y], axis=1)
array([[ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14], [ 5, 6, 7, 8, 9, 15, 16, 17, 18, 19]])
axis=1로 줄 경우 열을 기준으로.. 그니까 오른쪽으로 쌓아줌.
axis=0과 axis=1의 경우 현재 판다스에서도 겁나 헷갈리고 있어서 이부분은 따로 정리할 것이다.. 나는 정녕 공대생이 맞는가?
splitx = np.arange(12)
print(x)
np.split(x, 4)
[ 0 1 2 3 4 5 6 7 8 9 10 11] [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11])]
axis=1 열을 기준으로 분해x = np.arange(16).reshape(4, 4)
print(x)
np.split(x, 2, axis=1)
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]
x = np.arange(1, 10).reshape(3, 3)
y = np.arange(1, 4)
x + y

이런식으로 진행이 되는 것이다.
정말 편리하죠?
x.dot(y) # 행렬곱
np.transpose(x) # 전치행렬
np.linalg.inv(x) # 역행렬
np.linalg.det(x) # 행렬식
np.mean(x) # 평균
np.median(x) # 중간값
np.std(x) # 표준편차
np.var(x) # 분산
np.sum(x) # 합
np.sum(데이터, axis=1) # 합, 축 변경
np.cumsum(x) # 누적합
np.cumprod(x) # 누적곱
np.min(x) # 최소값
np.argmin(x) #최소값 위치
np.argmax(x) # 최대값 위치
np.any(x > 4) # 하나라도 참이어야 참
np.all(x > 4) # 모든 요소가 참이어야 참
np.where(x > 4) # 조건에 맞는 위치
np.where(x > 4, x, -100) # 조건, True일 경우, False일 경우
... 이런 것들이 있다😉
아진짜 실습 문제까지 다루려고 했는데 지금 11시 30분 졸려죽겠어요 죄송합니다
내일의 슬기가 힘내자..