기본적으로 알고리즘을 표현 하려면, 일반적인 Python 과 numpy로 표현 해야 하는데, 이것을 모르는 상태에서 그냥 데이터 셋만 불러와서 모델을 돌리는 것은 의미가 없다. 딥러닝의 CNN의 모델이 있다고 가정 하면, 그 모델에 대하여, 파라메터 튜닝에 의해 모델의 성능이 달라지는데, 파라메터 튜닝을 알려면 기본적인 알고리즘은 이다.
numpy의 국내 서적이 거의 없다. 있긴 한데, 굉장히 헤깔리게 많이 늘려 놓았다. 차라리 아래의 사이트에서 참조해서 코드를 익히는 것이 좋아서 아래의 사이트를 참고 하였다.
6. indexing, slicing : 머신러닝 계통에서는 데이터 셋을 처리 할때, feature(독립변수) 로 사용하나 target(반응변수) value 값을 가져올때, 가장 많이 사용된다.
결론적으로 이야기 하면 어떠한 형태로 데이터 모습을 바꾸더라도 데이터의 연산값은 바뀌지 않는다.numpy의 국내 서적이 거의 없다. 있긴 한데, 굉장히 헤깔리게 많이 늘려 놓았다. 차라리 아래의 사이트에서 참조해서 코드를 익히는 것이 좋아서 아래의 사이트를 참고 하였다.
넘파이 기초 |
numpy 기초
모듈 불러오기
import numpy as np
numpy 일반
1.arange : 순차적인 숫자 배열 만들기 아래의 코드는 0~5까지의 배열이 만들어 진다. 파이썬 특성상 R과 다르게 0 부터 시작 한다.
x = np.arange(6)
print(x)
[0 1 2 3 4 5]
2. 브로드 캐스팅 : 이것은 강의 들을 때 정말 많이 듣는 내용이다. 즉 딥러닝에서 계산하다 보면 차원을 변환 해야 하는 경우가 생긴다 3차원을 1차원으로 변환 하거나, 1차원을 2차원으로 변환 한다거나, 그런 이야기를 많이 듣는다.
x = np.arange(6).reshape(2,3)
print(x)
array([[0, 1, 2],
[3, 4, 5]])
3. linespace : 특정 범위 내에서 숫자 갯수 만큼 넣는 것으로 일정간격으로 넣는 것하고는 개념이 많이 다르다. 아래 예제는 0부터 10까지 공간에 6개의 숫자로 나누어 넣는 것이다.
x = np.linspace(0, 10, 6)
x
array([ 0., 2., 4., 6., 8., 10.])
4. array 배열 : 배열은 머신러닝/딥러닝 연산에서 주로 쓰인다. 배열은 주로 행렬연산으로 이루어진다. 예를 들자면, multi Layer를 사용 하여, 그래디언트 연산을 할때, 주로 행렬연산으로 이루어 진다. array를 이용하여, Linear Algebra(선형 대수) 도 같이 설명 할 수 있게 된다. 배열을 만들때는 숫자를 나열 한 다음에 브로드캐스팅을 할 수도 있지만, 초기 예제를 배울때는 직접 입력 한다.
# 1차원 배열
x = np.array([1,2,3])
print(x)
array([1, 2, 3])
# 2차원 배열
x = np.array([[1,2,3], [4,5,6]])
print(x)
array([[1, 2, 3],
[4, 5, 6]])
# 3차원 배열
x = np.array([[[1,2,3], [4,5,6]],
[[7,8,9], [10,11,12]]])
print(x)
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
# 모델을 돌리기 위한 초기값을 만들때, zeros 및 ones 를 만든다.
np.zeros((3,4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
# 3차원 ones로 만들때
np.ones( (2,3,4), dtype=np.int16 )
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]], dtype=int16)
Step 별로 array를 만들려면, 아래와 같이 범위를 주고 step 을 정의 해 준다. linespace와 헤깔리면 안된다.
# 순치적으로 숫자를 만드려면 arange를 를 이용하여, 간격을 둔다.
np.arange(10, 30, 5)
array([10, 15, 20, 25])
# 0.3 단위로 Step 을 나눈다
np.arange(0, 2, 0.3 )
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
5. shape (모양 보기) : 제일 많이 사용하는 기능이다. 데이터를 처음 받고 나서 로딩 한 다음에 제일 먼저 보는 기능이 shape 이다. 아래의 예는 차원, 행, 열을 보여준다.
x.shape #3차원 데이터 2개 요소
(2, 2, 3)
6. indexing, slicing : 머신러닝 계통에서는 데이터 셋을 처리 할때, feature(독립변수) 로 사용하나 target(반응변수) value 값을 가져올때, 가장 많이 사용된다.
데이터 인덱싱은 인덱스를 이용해서 특정 배열의 값을 추출 하는 것이고, 슬라이싱은 인덱스의 범위를 주어서 데이터를 추출 하는 것이다.
# 배열 만들기
a = np.arange(10)**3
a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
#indexing
a[2]
8
# slicing
a[2:5]
array([ 8, 27, 64])
# inverse
a[: :-1]
array([729, 512, 343, 216, 125, 64, 27, 8, 1, 0])
# 브로드 캐스팅
b = np.arange(12).reshape(3,4)
b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
# 마지막 행 추출하기 * 일반적으로 머신러닝에서 Target Value 선택할때 처리
b[:,-1]
array([ 3, 7, 11])
# fearture 데이터 셋 선택 할때 사용
b[:, :-1]
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10]])
# 첫번째 열보기
b[0]
array([0, 1, 2, 3])
7. Shape Manipulation : 딥러닝에 있어서 차원 축소 차원 확대, 차원 변환 Transpose할 하는 케이스이다. 이 경우는 아래와 같이 오토 인코딩 할때, 주로 사용되는 연산이다.
# random 함수 만들기
rg = np.random.default_rng(1)
a = np.floor(10*rg.random((3,4)))
a
array([[5., 9., 1., 9.],
[3., 4., 8., 4.],
[5., 0., 7., 5.]])
a.shape
(3, 4)
# 1차원 변환
a.ravel() # ravel 과 flatten 은 같음
array([5., 9., 1., 9., 3., 4., 8., 4., 5., 0., 7., 5.])
# 1차원 변환
a.flatten()
array([5., 9., 1., 9., 3., 4., 8., 4., 5., 0., 7., 5.])
# 2차원으로 브로드 케스팅
a.reshape(6,2)
array([[5., 9.],
[1., 9.],
[3., 4.],
[8., 4.],
[5., 0.],
[7., 5.]])
# Transpose (데이터 전치)
a.T
array([[5., 3., 5.],
[9., 4., 0.],
[1., 8., 7.],
[9., 4., 5.]])
마지막으로 Print arrays에 대해서 소스 코드 언급 하고 마무리 하겠다.
# 1차원 arrays
a = np.arange(6)
print(a)
[0 1 2 3 4 5]
# 2d array
b = np.arange(12).reshape(4,3)
print(b)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
# 3d array
c = np.arange(24).reshape(2,3,4)
print(c)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
댓글 없음:
댓글 쓰기