numpy 기초 브로드캐스팅, array, arange, indexing, slicing 야나두 딥러닝

  딥러닝 초반에 공부 할 때,  사람들이 굉장히 많이 헤깔려 하는 분야가 있다.  바로 numpy이다.  기본적으로 Python을 할때,  리스트 및 배열을 표현한다.  numpy.에서   주로 하는 것은 배열을 차원으로 표현하는 것이다.   Image연산은 3차원 배열이 되고,   일반적인 머신러닝은 2차원 배열로 한다.  주로 사용하는 명령어는  array, arange, 이다.  

기본적으로 알고리즘을 표현 하려면, 일반적인 Python 과  numpy로 표현 해야 하는데,  이것을 모르는 상태에서  그냥 데이터 셋만 불러와서 모델을 돌리는 것은 의미가 없다.     딥러닝의 CNN의 모델이 있다고 가정 하면,   그 모델에 대하여,  파라메터 튜닝에 의해 모델의 성능이 달라지는데,   파라메터 튜닝을 알려면 기본적인 알고리즘은 이다.  
 




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차원의 데이터를 받아 1차원으로 분류함


3. linespace : 특정 범위 내에서 숫자 갯수 만큼 넣는 것으로 일정간격으로 넣는 것하고는 개념이 많이 다르다.  아래 예제는 0부터 10까지 공간에 6개의 숫자로 나누어 넣는 것이다. 

x = np.linspace(0106)
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]]])

1차원 2차원 3차원 배열


 알고리즘을 만들기 전에 영행렬 1행렬로 초기화 하는 경우는 아래와 같이 한다. 

# 모델을 돌리기 위한 초기값을 만들때,  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(10305)
array([10, 15, 20, 25])

# 0.3 단위로 Step 을 나눈다
np.arange(020.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할 하는 케이스이다.  이 경우는 아래와 같이 오토 인코딩 할때,  주로 사용되는 연산이다. 

 
Tensorflow autoencoder 예시

# 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]]]

댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...