728x90
반응형

 이번 포스트에서는 Dictionary에 대해 살펴보도록 하겠다.

 

 

Dictionary

개요

  • Dictionary는 말 그대로 사전이라고 할 수 있으며, 사전은 기본적으로 "단어: 설명"의 구성으로 돼있다.
  • Python의 Dictionary 역시 key : value 관계로 이루어져 있으며, key를 이용해 해당하는 value를 받을 수 있다.
  • Dictionary의 안에는 scalar, list, array, DataFrame 등 다양한 Type의 Data 담을 수 있다.
  • Dictionary의 key는 순서가 따로 없으며, 내가 원하는 key에 해당하는 value를 얻고자 할 때, 순서가 없으므로 순차적으로 탐색하지 않고, 바로 value를 가지고 오므로 속도가 매우 빠르다
  • Dictionary의 안에 또 Dictionary를 넣을 수 있으며, 이 구조는 마치 Tree 구조와 같다.

 

 

 위 이야기만 보면 잘 와닿지 않으므로, 실제로 Dictionary를 만들어보자.

# Dictionary를 만들어보자.
>>> dict_a = {}
>>> type(dict_a)
dict

>>> dict_b = dict()
>>> type(dict_b)
dict
  • Dictionary는 위와 같이 dict()라는 함수를 쓰거나 {}를 이용해서 만들 수 있다.

 

 

 이번엔 Dictionary에 Data를 넣어보자

# Data를 넣어보자
>>> dict_c = {"아침":"만두", "점심":"햄버거", "저녁":"된장찌개"}
>>> dict_c
{'아침': '만두', '점심': '햄버거', '저녁': '된장찌개'}
  • Dictionary에는 key:value로 Data를 넣는다.
  • key에는 문자형("", ''로 묶인!), scalar(정수, 소수, None, Boolean)가 들어갈 수 있다.
  • value엔 무엇이든지 다 들어갈 수 있다.

 

 

 조금 더 복잡하게 Data를 넣어보자

>>> dict_c = {"아침":{14:"만두", 15:"피자", 16:"곰탕"},
              "점심":{14:"햄버거", 15:"떡볶이", 16:"라면"},
          	  "저녁":{14:"된장찌개", 15:"김치찌개", 16:"삼겹살"}}
>>> dict_c
{'아침': {14: '만두', 15: '피자', 16: '곰탕'},
 '점심': {14: '햄버거', 15: '떡볶이', 16: '라면'},
 '저녁': {14: '된장찌개', 15: '김치찌개', 16: '삼겹살'}}
  • dictionary 안에는 dictionary를 포함한 다양한 type의 data를 넣을 수 있다.

 

 

 야식이라는 key를 추가해보자

# "야식"이라는 새로운 Dictionary를 추가해보자
>>> dict_c["야식"] = {14:"김밥"}
>>> dict_c
{'아침': {14: '만두', 15: '피자', 16: '곰탕'},
 '점심': {14: '햄버거', 15: '떡볶이', 16: '라면'},
 '저녁': {14: '된장찌개', 15: '김치찌개', 16: '삼겹살'},
 '야식': {14: '김밥'}}
  • dict["key] = value를 사용하면 새로운 key와 value를 추가할 수 있다.

 

 

 이번에는 dict_c의 key가 무엇이 있는지 가져와보자

# Dictionary의 key들을 가지고 와보자
>>> dict_c.keys()
dict_keys(['아침', '점심', '저녁', '야식'])


# Dictionary 안의 "아침"dictionary의 key들을 가지고 와보자
>>> dict_c["아침"].keys()
dict_keys([14, 15, 16])


# key "아침"의 16일 식단이 무엇인지 알아보자
>>> dict_c["아침"][16]
'곰탕'


# key "야식"에 16일 식단을 추가해보자
>>> dict_c["야식"][16] = "짜파게티"
>>> dict_c
{'아침': {14: '만두', 15: '피자', 16: '곰탕'},
 '점심': {14: '햄버거', 15: '떡볶이', 16: '라면'},
 '저녁': {14: '된장찌개', 15: '김치찌개', 16: '삼겹살'},
 '야식': {14: '김밥', 16: '짜파게티'}}
 
 
# 알고보니 15일 저녁에 라볶이를 먹었다. 수정해보자
>>> dict_c["저녁"][15] = "라볶이"
>>> dict_c
{'아침': {14: '만두', 15: '피자', 16: '곰탕'},
 '점심': {14: '햄버거', 15: '떡볶이', 16: '라면'},
 '저녁': {14: '된장찌개', 15: '라볶이', 16: '삼겹살'},
 '야식': {14: '김밥', 16: '짜파게티'}}
  • Dictionary의 key나 value는 쉽게 추가, 수정할 수 있으며, 내가 원하는 것을 가져올 수 있다.

 

 

때로는 Dictionary를 이용해서 다양한 Data들을 담아놓는 거대한 선반 역할을 할 수도 있다.

# 기존에 배웠던 Type들을 모두 넣어보자
>>> import tensorflow as tf
>>> import numpy as np

>>> dict_d = {"scalar_1":int(32.9),
    	      "list_1":["A1", "A2", "A3", "A4"],
        	  "array_1":np.array([[1,3,5,7],[2,4,6,8]]),
          	  "tensor_1":tf.zeros(shape=(2, 3))}

>>> dict_d
{'scalar_1': 32,
 'list_1': ['A1', 'A2', 'A3', 'A4'],
 'array_1': array([[1, 3, 5, 7],
        [2, 4, 6, 8]]),
 'tensor_1': <tf.Tensor: shape=(2, 3), dtype=float32, numpy=
 array([[0., 0., 0.],
        [0., 0., 0.]], dtype=float32)>}
        
        
>>> dict_d["tensor_1"]
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[0., 0., 0.],
       [0., 0., 0.]], dtype=float32)>
  • Dictionary에는 다양한 종류의 Data를 넣어놓고 내가 필요한 Data를 꺼내 쓰는 곧간처럼 쓸 수 있다.
  • 말 그대로 Dictionary는 사전이므로, Tokenize 된 단어와 벡터들을 연결해서 word:Vector 사전으로 쓸 수도 있다.
  • Dictionary의 형태는 또 다른 자주 쓰이는 Type인 json과 동일하다. 그러므로, json을 사용하고자 하는 경우 Dictionary를 잘 다룰 수 있으면 매우 편하다.

 

 

Json

  • json은 데이터 분석을 위해서 다룰 줄 알아야 하는 Type 중 하나이지만, dictionary와 거의 유사하므로 따로 설명하지는 않곗다.
  • json은 Dictionary처럼 Data가 key:value로 이어진 형태이며, 따옴표(')와 큰따옴표(")로 발생하는 문제만 잘 해결한다면 Dictionary를 그대로 json으로 변환해서 사용해도 된다.
  • json은 json 모듈을 이용해 Python의 객체(Dictionary)를 Json 문자열로 변환시키면 된다.
  • 판다스의 DataFrame은 key(column: 열)과 value(row: 행)으로 서로 연결된 형태이므로, 사실 Dictionary와 굉장히 유사한 형태이다. 그러므로 Pandas의 DataFrame도 json 형태로 쉽게 만들 수 있다.
  • 추후 json module에 대해 설명하며 json에 대해 더 자세히 다루도록 하겠다.

 

 

 

 이번 포스트에서는 Dictionary에 대해 알아보았는데, 이번 포스트는 지금까지 포스트 중 가장 성의가 없지 않나?라는 생각이 들 정도로 글의 양이 적은 거 같다.

 다만, 위 함수들만 있어도 Dictionary를 사용하는데 큰 지장은 없으므로, 굳이 사족을 달지는 않겠다.

 다음 포스트에서는 데이터 분석가에게 익숙한 데이터 타입 중 하나인 DataFrame을 간략히 설명하고 기초 자료형에 대한 설명을 마치도록 하겠다.

728x90
반응형
728x90
반응형

 이전 포스트에서 Numpy의 array에 대해 간략하게 훑어보았다. 이번 포스트에선 머신러닝에서 대표적으로 사용되는 모듈인 tensorflow의 고유 Type 중 하나인 Tensor에 대해 학습해보겠다.

 

 

tensor

개요

  • Tensorflow는 Google에서 개발한 머신러닝의 대표적인 모듈로 tensor는 이 tensorflow의 대표적인 Type이지만, 정작 Tensorflow를 이용해서 머신러닝을 할 때에는 사용할 일이 많지 않은 type이기도 하다.
  • "Tensorflow를 활용해서 기계학습을 진행하는데 tensor를 쓰지 않는다니??"라는 생각이 들 수 있는데, tensorflow로 기계학습 진행 시, 일반적으로 keras를 이용해서 model을 생성하게 되고, 그 모델에 들어갈 데이터셋의 핸들링 과정에서 tensor로 핸들링하는 것보다 Numpy의 array를 이용해서 핸들링할 일이 더 많기 때문이다.
  • 애초에 Tensorflow의 tensor와 Numpy의 array의 관련 함수의 상당수가 거의 유사하다 보니, 여기저기 많이 쓰여 익숙하게 쓰는 Numpy의 array가 더 편하기 때문이기도 하다.

 

 

Tensor란?

  • Tensor란 N 차원의 배열(array)을 의미한다.
  • 일반적으로 1차원 배열을 벡터(Vector), 2차원 배열을 행렬(Matrix), 3차원 이상의 배열을 다차원 배열이라고 하며, 이들 모두를 통틀어서 Tensor라고 한다.
  • Tensor는 N 차원 배열이므로, 배열을 다루는 Numpy의 array와 태생적으로 기능이 유사할 수 밖에 없다.

 

 

Rank

Rank 이름 내용
0 스칼라 원소 1개, Python-기초: 1.0. 자료형(1) - scalar 참조
1 벡터 1차원 array, Vt = [0.1, 0.2, 0.3]
2 행렬 2차원 array, Mt = [[1, 3, 5] , [2, 4, 6]]
3 3 차원 텐서 3차원 array - Channel 추가
n n 차원 텐서 n차원 array - 축이 n개인 array
  • 뭔가 대충 설명한 느낌이 강한데, 보다 구체적으로 이해하려면 머릿속에 그림을 그려봐야한다.
  • Scalar > Vector > Matrix > 3-Tensor 이런 식으로 하나하나 층을 쌓아보자

  • Scalar를 하나의 원소로 보고, 그 원소가 일렬로 쭉 쌓으면 Vector, 그 Vector를 아래로 쭉 쌓으면 Matrix, Matrix를 N개의 층을 쌓으면 N-Tensor가 되는 것이다.
  • 보통 3-Tensor는 그림을 Tensor화(수치화) 했을 때, Red, Green, Blue에 대한 3개의 Layer를 쌓는다. 이를 Channer이라 한다.

 

 

Tensor를 가지고 놀아보자

# Tensor를 생성해보자.
# 1. 0으로 채워진 Tensor를 만들어보자
>>> tf.zeros(shape=(3, 10))
<tf.Tensor: shape=(3, 10), dtype=float32, numpy=
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)>
       
       
# 2. 1로 채워진 Tensor를 만들어보자
>>> tf.ones(shape=(3,4), dtype = "int16")
<tf.Tensor: shape=(3, 4), dtype=int16, numpy=
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]], dtype=int16)>
       
       
# 3. 내가 원하는 상수로 채워진 Tensor를 만들어보자 
>>> tf.fill(dims=(3, 6), value=3)
<tf.Tensor: shape=(3, 6), dtype=int32, numpy=
array([[3, 3, 3, 3, 3, 3],
       [3, 3, 3, 3, 3, 3],
       [3, 3, 3, 3, 3, 3]])>
       
     
# 4. array를 만들듯이 Tensor를 만들어보자
>>> tf.constant([[1,3,5,7],[2,4,6,8]])
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
array([[1, 3, 5, 7],
       [2, 4, 6, 8]])>
       

# 5. array를 이용해서 Tensor를 만들어보자
>>> array1 = np.array([[1, 3, 5, 7], [2, 4, 6, 8]])
>>> tf.constant(array1)
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
array([[1, 3, 5, 7],
       [2, 4, 6, 8]])>


# 6. 패턴을 갖는 Tensor를 만들어보자
>>> tf.range(1, 20, 3)
<tf.Tensor: shape=(7,), dtype=int32, numpy=array([ 1,  4,  7, 10, 13, 16, 19])>
  • 별 설명 없이 여러 tensor를 만들어보았는데, 이를 보면 앞서 봤던 numpy의 array와 굉장히 유사하다는 생각이 들지 않는가?
  • 애초에 tf.constant() 함수에 array를 담으면 tensor가 되고 모든 형태의 array를 포함하는 것이 tensor이므로, 굳이 tensor를 공부하지 않아도 Numpy의 array만 잘 다루면 tensor를 무리 없이 쓸 수 있다.

 

# Tensor의 다양한 속성들을 뽑아보자
>>> TS1 = tf.constant([[1, 3, 5, 7, 9, 11], [2, 4, 6, 8, 10, 12], [2, 3, 5, 7, 11, 13]],
						dtype="float64")
>>> TS1
<tf.Tensor: shape=(3, 6), dtype=float64, numpy=
array([[ 1.,  3.,  5.,  7.,  9., 11.],
       [ 2.,  4.,  6.,  8., 10., 12.],
       [ 2.,  3.,  5.,  7., 11., 13.]])>
   
   
# 1. shape을 뽑아보자 
>>> TS1.shape
TensorShape([3, 6])


# 2. shape을 바꿔보자
>>> tf.reshape(TS1, shape=(2, 9))
<tf.Tensor: shape=(2, 9), dtype=float64, numpy=
array([[ 1.,  3.,  5.,  7.,  9., 11.,  2.,  4.,  6.],
       [ 8., 10., 12.,  2.,  3.,  5.,  7., 11., 13.]])>


# 3. dtype을 뽑아보자
>>> TS1.dtype
tf.float64


# 4. dtype을 바꿔보자
>>> tf.cast(TS1, dtype="int64")
<tf.Tensor: shape=(3, 6), dtype=int64, numpy=
array([[ 1,  3,  5,  7,  9, 11],
       [ 2,  4,  6,  8, 10, 12],
       [ 2,  3,  5,  7, 11, 13]], dtype=int64)>
  • 위 예제를 보면 굳이 tensor로 변환을 하지 않고, Numpy로 데이터 핸들링을 하는 것이 더 편하겠다는 생각이 들지 않는가?
  • tensor를 통해 사용할 수 있는 함수가 이외에도 수없이 많으나, 이에 시간을 할애하기보다는 scipy, pandas, matplotlib 등 다양한 모듈에서 폭넓게 사용할 수 있는 Numpy를 공부하는 것이 보다 효율적으로 판단되므로, 본 블로그에서는 tensor의 관련 함수는 여기까지만 정리하도록 하고 Numpy를 더 자세히 학습하도록 하겠다.

 

 

dtype

  • 위 예제를 보면 dtype="int64"와 같이 우리가 기존에 알고 있는 int 뒤에 숫자가 붙어 있는 것을 알 수 있다.
  • dtype은 float32, float64, int8, int16, int32, int64, unit8, string, bool 등이 있으며 뒤에 있는 숫자는 bit를 의미한다.
  • 종종 앞에 있는 dtype인 float은 일치하지만 bit가 일치하지 않아 오류가 발생하기도 하니, 혹여 dtype error가 뜨는 경우, 이를 확인해보도록 하자.

 

 

 

 지금까지 가볍게 tensor에 대해 학습해보았다. tensor는 Numpy의 array와 기능이 거의 일치하며, tensorflow로 학습을 할 때도 Numpy를 주로 사용하니 더 파고들진 않겠다.

 그러나 위에서 설명한 Tensor Rank 그림은 상당히 중요한 그림이므로, 꼭 숙지하도록 하자.

728x90
반응형
728x90
반응형

 지금까지 scalar, list Type에 대해서 알아보았다. 이제 남은 대표적인 Type은 array, tensor, dictionary, DataFrame이 있는데, 이들은 앞서 다뤘던 두 Type에 비해 훨씬 심도 깊은 학습이 필요하므로, 특징만 간략히 설명하고 넘어가겠다.

 

 

array

Numpy의 array 

  • Python의 단점을 이야기할 때, 흔히들 느린 속도를 꼽는데, 이 이미지를 한 번에 종식시킬 수 있는 것이 바로 Numpy라는 모듈이며, 그 Numpy 모듈의 기본 Type이 바로 array다.
  • Numpy는 C언어, Fortran을 기반으로 만들어졌기 때문에 연산 속도가 매우 빠르며, 쉬운 것이 장점인 파이썬으로 구현되어 있기에 C언어를 공부하지 않고도 복잡한 수학 연산 문제를 아주 쉽고 빠르게 접근할 수 있다.
  • 특히 데이터 분석가의 친구인 판다스의 단점인 느린 속도를 해결할 수 있기 때문에 데이터 분석을 하고자 한다면, Numpy를 아주 잘 다룰 수 있어야 한다.
  • Numpy의 array는 Scipy, tensorflow, sklearn, Matplotlib, Pandas 등 빅데이터 분석에서 필수로 사용되는 모듈을 활용하는 데에 있어 기초가 되어준다.
  • 보다 상세한 내용은 추후 Numpy에 대해 자세히 학습할 때 이야기해보도록 하자.
# array를 사용하기 위해선 numpy 모듈을 가지고 와야한다.
>>> import numpy as np

# array는 list를 만들고 np.array() 함수에 넣어서 생성하기도 한다.
>>> a = [1,2,3,4,5]
>>> a_array = np.array(a)
>>> a_array
array([1, 2, 3, 4, 5])
  • numpy 모듈을 불러오는 import numpy as np는 "numpy를 수입(import) 해오겠다 np 처럼(as)" 이라고 곧이곧대로 해석해도 된다. 
    1. 이게 파이썬의 대표적인 장점 중 하나로 꼽히는 파이썬 코드가 우리가 실제로 사용하는 언어와 굉장히 가깝다는 것을 보여주는 대표적인 예시중 하나이다.
  • np는 numpy의 줄임말이며, Python은 "."을 기준으로 하여, 모듈로부터 하위 함수로 한 단계 한단계 내려가는 형태를 가지고 있다.
    • 즉, np.array()는 numpy 모듈의 array() 함수라는 뜻이다.
# array에 담겨있는 data type(dtype)은 상당히 중요하다.
>>> a_array.dtype
dtype('int32')


# 소수(float)로 구성된 array를 만들어보자
>>> b = np.arange(1, 10, 2, dtype = "float")
>>> b
array([1., 3., 5., 7., 9.])

>>> b.dtype
dtype('float64')
  • array.dtype은 array의 data type을 알 수 있다.
  • np.arange()은 앞서 list의 range와 비슷한 기능을 하며, array를 바로 생성한다.
  • array 내 data를 정수로 입력했다 할지라도 dtype을 "float"으로 지정하면 소수로 생성된다.

 

 

array 연산과 Broadcast

# Numpy의 array 연산은 R의 Vector 연산과 굉장히 유사하다.
>>> c = np.array([1, 3, 5, 7, 9])
>>> d = np.array([2, 4, 6, 8, 10])
>>> e = np.array([10, 20])


# 자리수가 동일한 array(vector)끼리는 동일한 위치의 원소끼리 연산이 이루어진다.
>>> print(c+d) 
[ 3  7 11 15 19]
>>> print(c*d)
[ 2 12 30 56 90]
>>> print(c/d)
[0.5        0.75       0.83333333 0.875      0.9]


# 자리수가 동일하지 않은 array(vector)간의 연산은 이루어지지 않는다.
>>> print(c + e)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-3b9c09c64b20> in <module>
----> 1 print(c + e)

ValueError: operands could not be broadcast together with shapes (5,) (2,) 
  • Numpy의 array 연산을 보면 R의 Vector 연산과 꽤 유사한 것을 알 수 있다.
  • Numpy의 array는 Tensorflow의 기본 Type인 Tensor와 거의 동일한 개념으로 봐도 문제없다.
    1. Tensor란 다차원 배열(array)을 아우르는 말이며, 이 안에는 1차원 배열인 Vector와 2차원 배열인 Metrics를 포함하는 것이다.
    2. 선형 대수학의 관점에서 접근할 때, array에 보다 익숙해지기 위해 1차원 array는 단순하게 vector로 부르도록 하겠다.
  • shape(모양)이 동일하지 않은 array끼리 연산 시, ValueError가 발생한다.
# BroadCast
>>> c
array([1, 3, 5, 7, 9])

>>> c * 2
array([ 2,  6, 10, 14, 18])

>>> c + 2
array([ 3,  5,  7,  9, 11])

>>> c / 2
array([0.5, 1.5, 2.5, 3.5, 4.5])
  • 1차원 array에 scalar 값을 연산 시, array의 모든 원소에 scalar값이 연산된다.
# array를 여러개 쌓으면 행렬이 된다.
>>> f = np.array([[1, 3, 5, 7],[2, 4, 6, 8]])
>>> f * 2
array([[ 2,  6, 10, 14],
       [ 4,  8, 12, 16]])
 
 
# 행렬에 대한 Broadcast
>>> f = np.array([[1, 3, 5, 7],[2, 4, 6, 8]])
>>> f * np.array([10, 20, 30, 40])
array([[ 10,  60, 150, 280],
       [ 20,  80, 180, 320]])
  • m*n행렬에 대해 스칼라 값을 연산하거나  n*1 벡터를 연산하면 array의 Broadcast와 같은 방식으로 연산이 이루어진다.
#  행렬 곱
>>> f = np.array([[1, 3, 5, 7],[2, 4, 6, 8]])
>>> f * np.array([[10, 10, 10, 10], [20, 20, 20, 20]])
array([[ 10,  30,  50,  70],
       [ 40,  80, 120, 160]])
       

>>> g = np.array([[10,10],[20,20],[30,30],[40,40]])
>>> np.dot(f,g)
array([[500, 500],
       [600, 600]])
  • 형태(shape)가 동일한 행렬끼리 *+-/와 같은 연산 수행 시, 동일한 위치에 있는 원소끼리 곱해진다(이는 우리가 일반적으로 아는 행렬곱이 아니다.).
  • m*n행렬, n*o행렬과 같이 행렬곱이 가능한 대상을 np.dot(mat1, mat2)을 하는 경우 우리가 아는 행렬곱이 연산된다.

 

 

배열의 형태

# array의 shape
>>> vt1 = np.array([1,2,3,4])
>>> vt2 = np.arange(1, 5, 0.1)
>>> mat1 = np.array([[1,3,5,7],[2,4,6,8]])
>>> mat2 = np.array([[1,10],[2,20],[3,30],[4,40]])

>>> print(vt1.shape)
(4,)
>>> print(vt2.shape)
(40,)
>>> print(mat1.shape)
(2, 4)
>>> print(mat2.shape)
(4, 2)


# 형태 변환(reshape)
>>> vt1.reshape((4,1))
array([[1],
       [2],
       [3],
       [4]])
>>> mat2.reshape((2,4))
array([[ 1, 10,  2, 20],
       [ 3, 30,  4, 40]])
       
       
# 평활(Flatten)
>>> mat1
array([[1, 3, 5, 7],
       [2, 4, 6, 8]])
>>> mat1.flatten()
array([1, 3, 5, 7, 2, 4, 6, 8])

>>> mat2
array([[ 1, 10],
       [ 2, 20],
       [ 3, 30],
       [ 4, 40]])
>>> mat2.flatten()
array([ 1, 10,  2, 20,  3, 30,  4, 40])
  • 앞서 이야기했던 array의 shape은 Numpy를 다루는 데 있어 필수 사항이며, 나아가 딥러닝을 다루는데 주로 사용되는 모듈인 tensorflow를 사용할 때도 매우 중요하다.
  • 상당수의 연산 오류는 shape이나 dtype이 일치하지 않아 발생한다.
  • reshape() 함수를 이용해서 array의 형태를 바꿀 수 있다.
  • 우리가 일반적으로 2차원으로 아는 행렬은 flatten() 함수를 통해 수월하게 벡터화되며, 이는 텐서플로우 학습 시, 상당히 중요한 내용이다.
    1. 행렬이 1차원 배열로 변환 가능하다는 것은 우리가 아는 2차원으로 알고 있는 행렬은 사실 상 1차원임을 의미한다. 이에 대해선 추후 Numpy를 설명하면서 보다 자세히 짚고 넘어가도록 하겠다.

 

 

 Numpy의 핵심 Type인 array는 이를 공부하는 데만 해도 상당한 시간을 투자해야 하기 때문에 이번 포스트에서는 가장 기본적인 array의 성격들만 알아보았다.

 앞서 list를 학습할 때, 발생했던 상당 부분의 list의 한계점으로 여겨졌던 부분들은 array를 통해 대부분 해결 가능하다.

 또 다른 Type인 tensorflow의 tensor는 numpy의 array와 굉장히 유사하며, 함수에 약간의 차이가 있긴하나 거의 동일한 기능들이 존재한다. 또한, tensorflow 학습 시, keras를 위주로 쓰게 되며, 굳이 tensor로 연산하기보다 numpy의 array로 연산하는 것을 추천한다. 

  1. tensorflow에서 tensor를 다루는 함수는 numpy의 array를 다루는 함수와 기능이 거의 일치한다. 굳이 tensor를 다루는 함수를 공부하지 않아도 tensorflow를 다루는데 큰 지장이 없다.
  2. tensorflow에 대해 추후 학습하겠으나, tensorflow 2.0 version에 들어오며, keras를 주로 활용하여 딥러닝을 실시하게 될 것이다.
  3. 상세한 내용은 python-Numpy 카테고리에서 포스팅하도록 하겠다.
728x90
반응형
728x90
반응형

 이전 포스트에선 빅데이터 분석을 하며 눈에 익었던 Python Type이 무엇이 있는지와 그중 하나인 Scalar에 대해 간략하게 알아보았다. 이번 포스트에서는 list에 대해 이야기해보자.

 

 

list

# list는 Data를 담는 가장 기본적인 상자라고 생각하자
# list는 다음과 같은 방법으로 만들 수 있다.
# 1. [] 사용하기
>>> list1 = [1, 2, 3, 4, 5, 6, 7]
>>> print(list1)
[1, 2, 3, 4, 5, 6, 7]

# 2. list() 함수 사용하기
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • list는 파이썬에서 가장 일반적인 데이터를 담는 type이다.
  • scalar(int, float, None, Boolean)뿐만 아니라 문자형(str)도 담을 수 있다.
  • 연산에 특화된 Type이 아닌 데이터를 담는 기본 그릇이라고 생각하는 것이 이해하기 쉽다.
  • list는 list() 함수, [] 안에 넣고자하는 Data를 넣어서 만들 수 있다.

 

Range

# range는 무엇인가?
>>> print(range(10))
range(0, 10)

# for문을 사용하여 range의 인자들을 출력해보자
>>> for i in range(10):
>>>    print(i)
0
1
2
3
4
5
6
7
8
9

# range()함수는 range(시작, 끝, 간격)으로 값을 내가 원하는 때에 호출할 수 있는 함수다.
>>> [i for i in range(4, 20, 2)]
[4, 6, 8, 10, 12, 14, 16, 18]
  • range() 함수는 꽤 자주 쓰이는 함수로, list와 꽤 친하니 이참에 설명하고 가겠다.
  • range(시작 값, 끝 값, 간격)을 입력하여 내가 원하는 패턴을 갖는 임의의 데이터를 생성할 수 있다.
  • 중요사항!) list에 data를 담는 경우, 그 data를 전부 생성해버리기 때문에 list를 생성하는 순간부터 memory를 쭉 잡아먹지만, range() 함수는 내가 원할 때, 그 값을 가지고 오기 때문에 memory 낭비가 발생하지 않는다.
    1. range() 함수를 출력하는 경우 range()라는 객체가 반환된다.
      • 객체란? 아주 단순하게 설명해보자면, X라는 함수를 통해 무언가를 만들어냈으나, 그 결과물이 가지고 있는 정보가 매우 다양해서 한 번에 다 보는 것이 어려운 상태이다.
      • 이 결과물에 특정 스위치를 붙이고 스위치를 켜주면, 그에 해당하는 정보를 볼 수 있다.
      • 즉, "내가 보여줄 수 있는 것은 아주 많은데, 뭘 원해?"라고 물어보고 있는 상태라고 생각하면 쉽다.
    2.  range() 함수로 생성된 range 객체는 당장 값이 나오지 않으며, for문과 같은 기능을 실행해주어야, 값을 반환한다.
      • 내가 원할 때, 값을 가지고 온다(for문을 실행)는 것은 제네레이터(Generator)와 유사해보이지만, range()는 엄밀히 따지면 Genarator가 아니다.
      • next() 함수를 이용해서 값을 꺼내면 오류가 발생한다.
      • 이는 추후 제네레이터를 설명할 때 다시 언급하도록 하겠다.

 

 

 

list의 연산

>>> a = [1,2,3,4]
>>> b = [5,6,7]
>>> print(a + b)
[1, 2, 3, 4, 5, 6, 7]


>>> print(a * b)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-f9c8a447c001> in <module>
----> 1 print(a*b)

TypeError: cant multiply sequence by non-int of type "list"


>>> print(a * 3)
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
  • Data가 담기는 그릇인 list는 연산보다는 Data를 담는 것이 주목적이다 보니 우리가 생각하는 연산과 다른 결과가 출력된다.
  • list와 list를 더 하면 두 list의 값이 합쳐지는(sum)것이 아닌 한 그릇으로 합쳐진다(extend).
  • list와 list의 곱은 데이터가 담긴 두 그릇을 곱하는 것이니 연산되지 않는다.
  • list에 int를 곱하면 데이터가 담긴 그릇을 그 int만큼 더 추가한다.
  • 이는 list가 연산이 아닌 데이터를 담는 그릇의 성질이 더 강하다는 것을 뜻한다. 때문에 list에는 숫자형과 문자형을 함께 담을 수도 있으며, 함께 담는다고 해서 데이터의 타입이 자동으로 바뀌지 않는다.

 

 

 

list의 인덱싱(슬라이싱)

# 내가 원하는 위치에 있는 값을 가지고 올 수 있다.
>>> c = list(range(20))
>>> print(c[3])
3
>>> print(c[5:12])
[5, 6, 7, 8, 9, 10, 11]

# list의 안에는 다른 list를 담을수도 있다!
>>> d = [3,5,7,['a', 'p', 'p', 'l', 'e']]
>>> print(d[3])
['a', 'p', 'p', 'l', 'e']
>>> print(d[3][3:])
['l', 'e']
  • Data를 담는 그릇인 list는 아주 쉽게 내가 원하는 위치에 있는 데이터를 가지고 올 수 있다.
  • list[위치]를 이용하면 그 위치에 있는 값을 가지고 온다.
  • Data를 담는 그릇인 list는 list 안에 list를 담을 수 있는데, 안에 있는 list를 가지고 오고 그 list 안에서 원하는 위치를 지정하면 똑같이 가져올 수 있다.
  • :는 가져오려는 index의 구간을 정해줄 수 있다.
# list에서 특정 조건에 맞는 값을 가지고 오기.
>>> print(c)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]


# 1. list c에서 10 이상인 값들을 가지고 와보자.
>>> c >= 10
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-0a29ddccf71f> in <module>
----> 1 c >= 10

TypeError: '>=' not supported between instances of 'list' and 'int'


# 2. for문과 if문을 혼용하여 가져와보자
>>> result = []
>>> for i in c:
>>>     if i >= 10:
>>>         result.append(i)
>>>     
>>> print(result)
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

# 3. 위 코드보다 단순하게 적어보자
>>> [i for i in c if i >= 10]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  • R이나 파이썬 numpy의 array는 c[c>=10] 처럼 단순한 코드로 조건에 해당하는 값을 가지고 올 수 있으나, list는 이 방법으로 data를 가지고 올 수 없다.
  • if문을 사용하여야하며, 아직 익숙하지 않은 사람이라면 "# 2. 주석"대로 코드를 짜는 것이 쉬우며, 어느 정도 코드에 익숙해진 후에는 "# 3. 주석"의 코드 같이 짧은 코드로 짜도록 하자.

 

 

 

기타 리스트에서 자주 쓰이는 함수

# 1. append: list에 값 추가
>>> e = []
>>> for i in range(2, 10, 2):
>>>     e.append(i)
>>>     
>>> print(e)
[2, 4, 6, 8]

>>> e0 = [1,3,5]
>>> e0.append([2,4,5])
>>> print(e0)
[1, 3, 5, [2, 4, 5]]




# 2. extend: list에 다른 list의 원소들을 추가하기
>>> e.extend([1,3,5,7])
>>> print(e)
[2, 4, 6, 8, 1, 3, 5, 7]




# 3. sort: 정렬
>>> e.sort(reverse = True)
>>> print(e)
[8, 7, 6, 5, 4, 3, 2, 1]

>>> e.sort()
>>> print(e)
[1, 2, 3, 4, 5, 6, 7, 8]




# 4. insert: 삽입
>>> e.insert(2, 20)
>>> print(e)
[1, 2, 20, 3, 4, 5, 6, 7, 8]




# 5. pop: 뽑아내기
>>> e1 = e.pop(2)
>>> print(e1)
20
>>> print(e)
[1, 2, 3, 4, 5, 6, 7, 8]




# 6. remove: 가장 왼쪽에 있는 해당하는 값 제거
>>> f = [4,5,6] * 3
>>> f.remove(5)
>>> print(f)
[4, 6, 4, 5, 6, 4, 5, 6]




# 7. len: list 내 원소의 갯수 세기
>>> print(len(f))
8




# 8. count: list 내 특정 원소의 갯수 세기
>>> print(f.count(5))
2
  • list.append(value)는 list에 다른 값(list도 하나의 원소로써 추가 가능!)을 추가하는 함수다.
  • list.extend(list)는 list + list랑 같다
  • list.sort(reverse = False)는 자주 쓰이는 함수인데, reverse는 역순으로 정렬하느냐를 의미한다. 기본적으로 reverse = False로 지정돼있으며, 이는 오름차순(작은 순)이다.
  • 그냥 list의 순서를 거꾸로 하고 싶다면 list.reverse()를 쓰자
  • list.insert(위치, 값) 함수를 이용하면 내가 원하는 위치에 원하는 값을 넣을 수 있다.
  • list.pop(위치) 함수는 해당 위치에 있는 value를 아예 뽑아버린다!
  • list.remove(값) 함수는 가장 왼쪽에 있는 해당 값만 제거하므로 모두 제거하고 싶다면 for문이나 while문으로 반복실행하자
  • len(list) 함수는 list 내 원소의 수를 가지고 온다.
  • len(문자) 함수는 문자의 길이를 반환한다.
  • list.count(value)는 list 내 value의 개수를 가져오는 유용한 함수다.

 

 지금까지 list type에 대해 빠르게 훑어봤는데, 파이썬의 가장 기초가 되는 Data를 담는 type이다 보니 꽤 자주 쓰이는 type이다.

 위의 list 관련 함수들을 보다 보면, 분석가가 바라는 기능에 비해 조금씩 나사가 빠져있어, 원하는 결과를 내기 위해선 for문이나 while문을 섞어줘야 하는 경우가 꽤 있다.

 이 것이 본문에서 "list는 Data를 담는 그릇이지, 연산을 위한 Type은 아니다"라 한 이유이기도 한데, 이후에 학습할 array, DataFrame 등은 연산이나 데이터 정리에 훨씬 특화돼있기 때문에 연산이나 Indexing 등에서 훨씬 쉽고 우월한 성능을 낸다.

 이후 포스트에서 다룰 array와 DataFrame 등은 그 기능이 굉장히 다양하고, 이를 설명하려면 어지간한 전공서적만큼 설명이 필요하므로, 나머지 Type 포스팅에선 살짝 찍어만 먹어보고, 다른 카테고리인 Python-Pandas와 Python-Numpy에서 자세히 다뤄보자.

728x90
반응형
728x90
반응형

 

 Python, R과 같은 수많은 언어들에서 제일 중요한 건, 해당 언어에서 어떠한 자료형을 가지고 있느냐다.

 대부분의 오류는 사용하려는 api에 데이터를 담고 있는 형태(Type), 담겨 있는 데이터의 형태(Data type), 데이터의 구조(Shape)가 적합하지 않아 발생하며, 어지간해선 이를 해결하면 해결된다.

 성능향상 문제에서도 Type, Data type, Shape은 지대한 영향을 미치며, 이를 어떻게 가지고 노느냐에 따라서 같은 알고리즘도 전혀 다른 방식으로 접근할 수 있다.

 그러므로, Python 첫 번째 page에선 이에 대해 간략하게 살펴보도록 하자

  • Python을 사용하면서 느낀 중요한 부분에 대해 짚고 넘어갈 것이므로, 보다 상세한 설명을 원한다면 구글링 하길 바란다(분석가에게 제일 중요한 능력은 검색 능력이지 않는가!).
  • 일부 자료형은 설명하다보면 아주 깊게 들어가게 되므로, 자세한 설명은 뒤로 미루도록 하겠다.
  • Python을 사용하며, 데이터 분석에 유용하다고 느낀 Type을 위주로 설명한다.

 

 

 

Type

  1. scalar
  2. list
  3. array
  4. tensor
  5. dictionary
  6. DataFrame

 위 6가지 외에도 여러 Type이 존재하지만, 데이터 분석을 하면서, 숨 쉬듯 사용했던 Type 위주로 추려냈다.

 위 Type중 numpy의 array나 pandas의 DataFrame, tensorflow의 tensor 같이 해당 Type의 기능이 꽤 많아 제대로 이해하고 사용하려면 두꺼운 책 여러 권을 읽어야 하지만, 이는 뒤로 미뤄두고 오늘은 가볍게 설명해보자.

 

 

 

Scalar

 scalar를 극단적으로 단순하게 말해보면, 그냥 숫자나 문자가 딱 한 개 나오는 경우를 가리킨다. 여기서 문자라는 것은 눈에 보이기엔 문자처럼 보이지만 실제로는 숫자인데, 대체 이게 뭔소리냐 싶겠지만, 설명을 들어보면  꽤 쉽게 이해될 것이다.

 Python의 scalar에는 크게 4개의 자료형이 있다.

  1. int
  2. float
  3. None
  4. Boolean

 여기서 int는 정수, float는 소수, None은 값이 없음, Boolean은 True or False이다. 자, 이제 하나하나 설명해보도록 하자.

 

int(정수)

# int
>>> 1
1
  • 자, 숫자 1을 셀 안에 넣고 ctrl + enter를 입력하니 1이 반환되었다.
  • >>>는 입력한 코드
  • 아래에 >>> 없이 숫자만 나온 경우는 출력된 결과이다.
>>> a = 1
>>> print(a)
1
>>> print(type(a))
<class 'int'>
  • a에 1을 할당하고 print() 해보자
  • print()는 말 그대로 print(출력)하는 함수이다.
  • 참고로 주피터 노트북의 경우 셀의 맨 마지막 줄에 출력하고자 하는 함수를 입력하면, 해당 함수의 내용이 바로 출력 된다.
  • type()은 변수의 자료형을 확인하는 방법이다.
# int 함수를 이용하면 소수를 정수로 바꿀 수 있다.
# 소수 > 정수
>>> int(2.35)
2
# Boolean > 정수
>>> int(True)
1
# 문자 > 정수
>>> int("123")
123
  • int() 함수는 int가 될 수 있는 자료형을 int로 바꿔주는 역할을 한다.
  • ""나 ''는 문자를 의미하는데 담겨 있는 내용이 숫자인 경우엔 숫자로 바꿀 수 있다.
  • True의 경우 분명 문자인데 정수 1로 바뀌는 것이 이상하게 보일 수 있는데, 이는 꽤 재미난 성질이므로, 뒤에서 다시 언급하도록 하겠다.
  • 그러나, 정수로 형태를 변환시킬 수 없는 경우 ValueError가 뜨게 된다.
>>> int("scalar")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-45517d963ca8> in <module>
----> 1 int("scalar")

ValueError: invalid literal for int() with base 10: 'scalar'



>>> int("1.25")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-fb02bea94e38> in <module>
----> 1 int("1.25")

ValueError: invalid literal for int() with base 10: '1.25'



>>> int("True")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-c0bc75205372> in <module>
----> 1 int("True")

ValueError: invalid literal for int() with base 10: 'True'
  • "" 나 '' 안에 문자 혹은 소수가 들어가는 경우 ValueError가 발생한다.
  • 앞에서 1로 바뀌었던 True 역시 "True"로 들어가는 경우 ValueError가 발생한다.

 

 

float(소수)

# float
>>> print(1.25)
1.25

>>> b = 2.75
>>> print(b)
2.75

>>> print(type(b))
<class 'float'>

>>> print(float(10))
10.0
  • 말 그대로 소수이다.
  • int() 함수와 마찬가지로 float()를 하면 정수를 소수로 치환할 수 있다.
  • int()함수와 마찬가지로 float()이 될 수 없는 대상을 치환하려고 하는 경우 ValueError가 뜬다.
# 반올림, 올림, 버림을 해보자
>>> import numpy as np
>>> import math

>>> c = 15.62719

# 반올림
>>>print(np.round(c, 2))
>>>print(round(c, 3))
15.63
15.627

# 올림
>>> print(np.ceil(c))
>>> print(math.ceil(c))
16.0
16

# 버림
>>> print(np.trunc(c))
>>> print(math.trunc(c))
15.0
15
  • 반올림은 python의 기본 함수인 round가 있다.
  • 반올림, 올림, 내림은 주로 numpy, math 모듈의 함수를 이용한다.
  • numpy으로 충분하므로, 굳이 math 모듈을 가지고 올 필요는 없다.
  • import는 특정 모듈을 가지고 온다는 것을 의미하며, as는 그 모듈을 as 뒤에 있는 문자로 간단하게 표현하겠다는 것을 의미한다.
  • np.round(x, N): float x를 소수점 N 자리에서 반올림한다.
  • np.ceil(x): float x를 올림 한다(math.ceil()과 달리 결과는 float으로 반환).
  • np.trunc(x): float x를 내림한다(math.trunc()과 달리 결과는 float으로 반환).

 

 

None(값없음)

>>> None

>>> d = None
>>> print(d)
None
  • 말 그대로 값이 없다는 것을 의미한다.
  • 특정 변수를 미리 생성해놓고 추후 Data를 넣는 경우나, 결측 값 같이 값이 있어야 하는데 존재하지 않음을 나타낼 때 사용된다.

 

 

Boolean

>>> e = 10
>>> print(e == 10)
True

>>> print(e == 12)
False

>>> print(e != 10)
False

>>> if e == 10:
>>>     print("Go")
>>> else:
>>>     print("stop")

Go
  • Boolean 또는 Bool이라 불리는 scalar는 True와 False 두 개의 값으로 이루어져 있다.
  • if 문과 같이 True, False에 따라 다른 결과를 반환하는 경우나, 특정 값을 추출할 때 자주 사용된다.
>>> bool(1)
True

>>> bool(10.0)
True

>>> bool("abc")
True

>>> bool(0)
False

>>> bool(0.0)
False

>>> bool("")
False

>>> print(int(True))
1

>>>> print(int(False))
0
  • Boolean의 True는 1에 False는 0에 대응한다(이 성질을 잘 이용하면 코드를 아주 단순하게 만들 수 있다).
  • bool() 함수를 이용하면 0, 0.0, ""은 False에 나머지 경우는 True를 반환한다.

 

 

그 외

 위 내용을 보면 그렇다면 알파벳 같은 문자의 Type은 무엇일까? 하는 궁금증이 들 것이다.

>>> type("abc")
str

>>> type("123")
str
  • str이라 반환되며, 이는 string의 줄임말로 문자열을 의미한다. 문자와 숫자 Data는 그 접근 방향이 꽤나 다르므로, "Data가 딱 하나 있는 것들을 scalar라고 뭉뚱그려 말하지 않는구나!"라고 단순히 생각해보자.
  • scalar에 대한 심층적인 설명으로 들어가면, 내용이 상당히 길어지므로, 단순하게 숫자로 표현할 수 있거나 값이 존재하지 않는 경우를 scalar라고 생각하면 된다(상세한 내용은 위키피디아를 참조하자).
  • scalar는 뒤에서 배울 벡터에 원소가 하나만 있는 상태라고 생각하면 된다.

 

 

 이번 포스팅에서는 데이터의 Type과 scalar에 대해 알아보았다. 간략히 설명하려 했으나, 쓰다 보니 내용이 꽤 길어져 이 사람이 뭘 이야기하고 싶은 건가 싶을 수도 있으니, 다음 포스트부터는 좀 더 단순하게 적어보도록 하겠다.

 
728x90
반응형
728x90
반응형

지난 포스트에서 기계학습(Machine Learning)에 대해 간략하게 알아보았다.
이번 포스트에선 기계학습을 수월하게 할 수 있게 해주는 텐서플로우(Tensorflow)에 대해 알아보도록 하자.

 

 

텐서플로우(Tensorflow)란?

  • 텐서플로우는 구글에서 2015년에 공개한 기계학습 라이브러리로, 일반인들도 기계학습을 사용할 수 있을정도로 난이도가 낮고, 아주 강력한 성능을 가지고 있다.
  • 단, 텐서플로우는 딥러닝 알고리즘인 인공신경망이 한 번 학습되기 시작하면 신경망의 구조가 고정되어버리기 때문에 특정 프로젝트에 최적화하여 사용하는데 한계가 있다.
  • 최적화까지 감안하여 기계학습을 하기 위해선, 신경망의 구조까지 스스로 학습하며 변하는 페이스북 인공지능팀에서 개발한 파이토치(PyTorch)를 사용해야한다(텐서플로우와 파이토치의 성능차이는 상당히 큰 편이다).
    • 텐서플로우는 참고 자료가 더 많고, 사용자가 파이토치보다 텐서플로우가 많은 편이므로, 텐서플로우를 먼저 학습하고, 그 후에 파이토치를 학습할 예정이다.
  • GPU, CPU 2가지 버전이 존재하며, GPU는 tensorflow-gpu라는 패키지를 따로 다운로드 받아야한다.
    • GPU는 NVIDIA의 CUDA를 사용하므로, NVIDIA 그래픽 카드가 필수이다.
  • 본 포스트에서는 텐서플로우 Version 2.0.0으로 학습할 예정이다.
  • 텐서플로우2는 Keras를 기반으로 작동한다.

 

※ CPU와 GPU를 왜 구분해서 사용하는 것일까???

  • CPU와 GPU의 차이를 간단하게 설명하자면 다음과 같다.
  • CPU는 아~~~주 머리가 좋은 친구로, 전교 10등 안에 들어가는 수학 천재인 친구다. 수능에서 4점짜리 문제들도 쉽게 풀정도로 어려운 수학 문제도 큰 힘을 들이지 않고 풀 수 있는 친구지만, 당연히 숫자가 적고, 한 번에 할 수 있는 일이 많지가 않다.
  • GPU는 기본적인 수학 능력을 갖춘 평범한 친구들이다. 수능에서 2점짜리 문제 같이 간단한 수학 문제라면 손 쉽게 풀 수 있지만, 어려운 수학 문제를 푸는데는 한 세월이 걸린다. 숫자가 1,000명 정도로 엄청나게 많다.
  • 자, 이를 더 간추려 말해보면 CPU는 머리가 좋지만 숫자가 적고, GPU는 머리는 평범하지만 숫자가 많은 친구들이다.
  • Python이나 R은 기본적으로 CPU 연산을 하며, CPU 연산을 하다보니 아무리 어려운 문제라 할지라도 크게 힘들이지 않고 풀 수 있지만, 머신러닝에서는 이야기가 달라진다. 딥러닝에서 사용되는 가장 대표적인 알고리즘인 인공신경망은 기본적으로 행렬 연산을 통해 계산되는데, 이러한 행렬 연산은 더하기, 빼기, 곱하기, 나누기와 같은 기본적인 사칙연산을 수십 만번 실시한다고 생각하면 된다.
  • 자, 사칙연산 수십 만번을 머리가 엄청 좋은 한 명에게 시키는 것과 평범하지만 사칙연산은 충분히 해내는 천 명에게 시키는 것, 이 둘 중 무엇이 더 효율적일까?? 당연히 사칙연산을 충분히 해낼 수 있는 천 명에게 문제를 주는 것이 훨씬 빠르지 않겠는가.
  • 이처럼 기계학습의 특징은 어려운 연산도 물론 있지만, 이 어려운 연산은 CPU에게 맡기면 되고, 쉬운 연산은 GPU에게 맡기는 방식을 사용한다. 즉, 컴퓨터의 자원을 이분화시켜 사용하는 것이 기계학습의 특징이다.

 

 

 

텐서플로우(cpu) 설치 방법

  • 텐서플로우만 설치하는 것은 난이도가 상당히 낮은 편이다.
  • 텐서플로우는 버전 2.0.0을 설치할 것이다.
    1. PyCharm의 UI를 이용해서 설치하기
      File > Settings > +버튼 >  tensorflow 검색 및 선택 > Specify version 체크 > 드롭박스에서 버전 2.0.0으로 선택 > Install Package 클릭
    2. 터미널에서 설치하기(아나콘다 가상환경을 만든 경우 *추천)
      cmd 실행 > conda env list(가상환경 목록 확인) > conda activate 가상환경이름 > pip install tensorflow==2.0.0

 

 

 

텐서플로우-gpu 설치 방법

  • tensorflow-gpu 설치를 위해서는 몇 가지 사전 작업이 필요하다.
    1. NVIDIA 그래픽 카드
    2. CUDA Toolkit 10.0 Version 설치
    3. cuDNN 설치
    4. PATH 설정
  • tensorflow-gpu는 gpu를 이용해서 연산하므로, 컴퓨터 환경에 gpu 셋팅을 해줘야한다.
  • NVIDIA 그래픽 카드가 설치되어있다는 전재하에 설치 해보도록 하겠다.
  • CUDA Toolkit의 버전은 11까지 나왔지만, 아직 호환성에 문제가 있는지 제대로 설치가 되지 않는다. 또한, 우리는 텐서플로우 버전 2.0으로 작업할 예정이므로, 이에 맞는 CUDA Toolkit Version 10.0을 사용해보도록 하자.
  • 설치 환경은 Windows이다.

 

 

1. CUDA Toolkit을 설치해보자.

CUDA Toolkit 10.0 버전 싸이트로 들어가자

 

CUDA Toolkit 10.0 Archive

Select Target Platform Click on the green buttons that describe your target platform. Only supported platforms will be shown. Operating System Architecture Distribution Version Installer Type Do you want to cross-compile? Yes No Select Host Platform Click

developer.nvidia.com

 

내 환경에 맞는 버전으로 다운로드 받자

  • Windows 환경에서 사용할 예정이다.
  • Windows는 10을 사용하고 있다.
  • 오프라인 환경에서도 사용할 수 있도록 Local로 다운로드 받겠다.
    (인터넷이 되는 환경이라면, 시간이 오래걸리므로 exe(network)로 다운로드 받도록 하자.)

 

이제 설치를 해보자.

  • CUDA  설치는 크게 어렵지 않다.
  • 따로 경로나 설정에서 손을 볼 것은 없으므로, 그냥 쭉 진행하면 된다.

 

 

 

2. cuDNN을 설치해보자.

 

 

NVIDIA cuDNN

NVIDIA cuDNN The NVIDIA CUDA Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, norma

developer.nvidia.com

  1. Download cuDNN을 클릭한다.
  2. cuDNN은 로그인을 해야만 설치 가능하므로, 아이디가 없다면, 아이디를 만들고 로그인하도록 하자.

 

 

CUDA와 내 환경에 맞는 버전으로 설치하자.

  • CUDA v10.0으로 설치하였으므로, cuDNN은 v7.6.5.로 다운로드 받겠다.
  • Windows 10 환경으로 설치하겠다.

 

 

  • cuDNN을 CUDA가 설치된 위치에 덮어씌우도록 하자.
    • 만약  CUDA를 설치할 때, 따로 경로를 손대지 않았다면 아래 경로에 덮어 씌우면 된다.
    • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
    • 위 경로에 cuDNN 압축파일을 해제하여 나온 파일들을 덮어씌우자.

 

 

 

3. PATH를 설정해주자.

  • cmd에 들어가자.
  • 아래와 같게 타이핑 해주자
    • SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin;%PATH%
    • SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64;%PATH%
    • SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include;%PATH%
    • SET PATH=C:\tools\cuda\bin;%PATH%

 

 

 

위까지 작업을 마치면, tensorflow-gpu를 설치할 환경이 완료된 것이다. 만약 위 셋팅을 마쳤음에도 tensorflow-gpu가 설치되지 않는다면, Visual Studio를 설치해주거나 업데이트 해주도록 하자.

자 지금까지 텐서플로우를 사용할 수 있는 환경 셋팅을 모두 완료해보았다. 텐서플로우 설치는 pip install을 이용해서 설치하면 되며, 이에 대한 내용은 python 카테고리에서 패키지 설치법을 확인해보도록 하자.

다음 포스트에서는 텐서플로우를 쓰는법에 대해 차근차근 알아가보자.

728x90
반응형
728x90
반응형

 파이썬은 다루기 쉽고, 다양한 기능을 가지고 있고, 공짜라는 장점을 가지고 있지만, 인터넷이 가능한 환경이 아니라면, 패키지를 바로바로 설치하기가 불가능하다는 단점이 있다.

 그리고, 때때로 당신은 보안 수준이 상당히 높아서 인터넷이 사용할 수 없는 공간에서 파이썬을 써야할 수도 있다. 그렇다면, 파이썬은 인터넷만 안된다면 사용할 수 없는 것일까? 

 가장 좋은 방법은 외부에서 미리 필요한 모든 패키지들을 다운받아서 들어가는 것이겠지만, 보안수준이 높은 기관이라면, 이것이 불가능할 가능성이 높다.

 이외의 방법은 필요한 패키지들을 파일로 다운받아서, 이를 CD 혹은 USB로 반입하는 것인데, 이번 포스트에선 해당 방법에 대해 자세히 알아보도록 하겠다.

 

 

 

패키지를 파일로 다운로드 받아보자.

1. cmd에 들어가보자.

  • cmd를 관리자로 들어가자.

 

 

2. 내가 원하는 경로로 이동해보자.

  • 파이썬 패키지들이 다운로드될 경로를 정한다.
  • c 드라이브에 packages라는 폴더에 저장하도록 하겠다.
    (c 드라이브에 packages라는 폴더를 미리 생성해놓자.)
  • dir
    : directory의 약자로 현 위치에 있는 파일 및 폴더의 목록들이 나온다.

  • cd..
    : 현 디렉토리에서 하위 디텍토리로 이동한다.

  • cd packages
    : packages라는 파일로 디렉토리를 옮긴다.

 

 

3. 이동된 경로에 내가 원하는 패키지를 다운로드 받아보자.

  • 다운로드 받을 파일의 이름은 pip_packages로 임의로 정하였다.
  • pip download -d ./pip_packages/ pandas==1.0.1
    •  pip download: 패키지를 설치하는 것이 아닌 다운로드 하는 코드이다.
    •  -d: 디렉토리를 말한다.
    •  ./pip_packages/: 패키지가 설치될 파일이다(없는 경우 자동으로 생성 됨).
    •  pandas==1.0.1: 다운로드 받고자 하는 패키지와 그 패키지의 버전이다.
      (애초에 아나콘다를 인터넷이 안되는 곳에 가져가서 깔면 대부분의 패키지가 설치되므로, 아나콘다에 없는 패키지만 다운로드 받도록 하자.)
    • 버전을 따로 쓰지 않으면 최신 버전이 설치된다.
  • 다운로드 되는 패키지는 의존성이 있는 다른 패키지까지 전부 다운로드된다.

  • 위와 같이 방금 지정하였던 폴더에 관련 패키지들이 모두 다운로드 된 것을 볼 수 있다.
  • 다운로드 되는 파일 형태는 whl, tar 확장자이다.
  • 필요한 패키지들을 모두 다운로드 받았다면, 이를 압축파일로 묶어서 USB나 CD로 옮기도록 하자.

 

 

4. 패키지를 오프라인 환경에서 설치해보자.

  • 오프라인 환경에서 해당 파일에 들어있는 패키지를 다운받는 방법은 다음과 같다.
  • pip install --no-index --find-links=./pip_packages/ pandas==1.0.1
    • pip를 이용해서 가져올때 보는 곳을 PyPI가 아닌 ./패키지들이 들어 있는 파일 이름/ 으로 한다.
    • 띄어쓰기를 주의하도록 하자.
  • 다운받았던 패키지의 이름을 그대로 입력해주면 내가 원하는 패키지를 설치할 수 있으며, 의존성 있는 패키지 역시 자동으로 설치된다.

 

 

지금까지 내가 원하는 모듈을 다운로드 받는 방법에 대해 학습해보았다.

다음 포스트에서는 현재 파이썬에서 가장 핫한 모듈이자, 빅데이터 분석 시대의 꽃인 텐서플로우(Tensorflow)의 설치 방법에 대해 학습해보도록 하겠다.
(텐서플로우 설치 방법은 다른 패키지들과 달리 조금 더 과정이 필요하다.)

728x90
반응형
728x90
반응형

 

모듈(Module)이란?

 여러분이 파이썬을 본격적으로 활용하다보면 어느 순간부터인가 모듈, 모듈화한다 등의 말을 듣게 될 것이다. 모듈은 함수(Function), 변수(Variable), 클래스(Class)를 이쁘게 잘 모아서 잘 포장해놓은 것을 말한다. 

 그리고, 이렇게 이쁘게 잘 정리해놓은 모듈에서 우린 언제든지 내가 원하는 기능을 뽑아서 사용할 수 있다. 자, 만약 당신이 R을 미리 학습하고 왔다면, R의 라이브러리(Library)가 떠오르지 않는가?

 파이썬에서는 R의 library를 모듈(Module)이라 부르고, 우리는 언제든지 내가 필요한 모듈에서 내가 필요한 기능을 가져와서 사용할 수 있다. 앞서서 파이썬의 특징에 대해 설명할 때, 파이썬은 다양한 모듈(라이브러리라고 혼용하여 사용하였음.)들이 서로서로 의존성을 가지고 있으므로, 설치가 꽤나 어렵다고 했는데, 이번엔 그 어려운 모듈 설치를 한번 해보도록 하겠다.
(환경은 이전까지 학습한 PyCharm에 아나콘다 가상환경으로 진행할 것이다.)

 

 

 

 

모듈 설치 방법은?

아나콘다, 파이참 이 2가지를 설치한 우리에겐 총 3가지의 모듈 설치방법이 있다.

1) pip로 설치하기

  • 파이참 터미널에서 설치
    • 파이참 좌측 하단을 보면 Terminal이라는 버튼이 있으며, 해당 버튼을 누르면 cmd창을 파이참에서 바로 사용할 수 있다.
    • 우측의 Event Log에서는 코드 실행 후 발생한 특이사항들을 확인할 수 있다.
    • 우측하단의 Event Log 버튼도 동일한 기능을 갖는다.

 

  • cmd 창을 바로 이용한다.
    • Anaconda를 설치하면서 생긴 Anaconda prompt 창을 사용해보자(그냥 cmd 창도 가능).
    • 만약 이전 포스트의 내용까지 잘 따라왔다면, 아마 Anaconda prompt (가상환경이름)이라는 파일도 생겼을 것이다. 해당 파일을 클릭하면, 가상환경에 대한 prompt로 들어가게 된다.

 

  • pip install 모듈이름
    : "모듈이름"을 pip로 설치한다.
  • pip uninstall 모듈이름
    : "모듈이름"을 제거한다.
  • pip list
    : 현재 환경에 설치되어 있는 파이썬 모듈의 목록을 가지고 온다.
  • pip install --upgrade pip
    : pip를 최신 버전으로 업그레이드 한다(처음 pip를 쓰기 전이라면 꼭 해주도록 하자.)
  • pip --version
    : pip 버전 확인
  • pip란?
    • pip는 파이썬으로 작성된 패키지 소프트웨어를 설치, 관리하는 패키지 관리 시스탬이다. Python Package Index(PyPI)에서 많은 파이썬 패키지를 볼 수 있다(위키피디아).
    • 그러나, pip는 앞서 다른 포스트에서 말했듯, 모듈 설치 시 충돌이 발생하면 이 부분을 무시해버리기 때문에 설치가 제대로 안될 위험이 있다.
    • 그러므로, 가능한 conda를 써보도록 하자.

 

 

2) Conda 써보기

앞서 우리는 아나콘다를 깔았고, 가상환경을 깔았으므로, 아나콘다 prompt를 이용해서 설치해보도록 하겠다.

  • 아나콘다 가상환경 프롬프트인 Anaconda prompt (가상환경이름)으로 들어가보자.

  • 그냥 Anaconda의 명령 prompt는 (Base)... 로 시작하지만, 가상환경에서는 (가상환경이름).. 으로 시작한다는 차이가 있다.
  • 파이썬은 모듈을 설치 및 관리할 때, 충돌이 일어나기 쉬우며, 충돌이 발생한 경우, 그때 그때마다 파이썬과 관련된 모든 파일을 삭제하여야할 수도 있지만, 가상환경을 사용하면, 해당 가상환경만 제거하면 된다.
  • conda install 패키지이름
    : conda로 내가 원하는 패키지를 설치할 수 있다.
  • conda란?
    • 아나콘다의 패키지 관리자로, 패키지 설치 시 현재 환경과 충돌 여부를 확인한다. 
    • 일반적으로 "conda install 패키지이름"으로 패키지를 설치해보고, 그 후에 "pip install 패키지이름"을 사용하는 것을 추천한다.

 

 

3) 파이참에서 설치해보자

파이참에서 터미널을 사용하지 않고, 파이참만의 방식으로도 설치가 가능하다.

  • File > Settings을 클릭하고 들어가보자.
  • Project: 프로젝트이름 > Project Interpreter를 눌러보면 아래와 같은 화면이 뜬다.

 

  • + 버튼을 눌러보자.

  • + 버튼을 누르면 설치돼있는 모듈은 파란색으로, 설치가 아직 안된 모듈은 하얀색으로 표시가 된다.
  • 또한 Description을 보면 간략한 상세 정보를 볼 수 있다.
  • 우측 하단 Specify version을 체크하면, 내가 원하는 버전으로 설치할 수 있다.
  • 설치하고자 하는 패키지를 클릭하고 좌측 하단의 Install package를 클릭하면, 해당 패키지가 설치된다.
  • 설치 진행 상황은 파이참의 최하단부에서 확인 가능하다.
  • 설치 가능한 모든 패키지가 검색 가능하진 않다. 특정 패키지의 경우 파이참 UI를 이용해서 설치가 불가능하므로, 그런 경우 conda나 pip를 써서 설치하도록 하자.

 

 

만약, 파이썬 모듈을 설치하다가, 설치된 패키지들끼리 충돌을 일으키거나, 잘못된 패키지 설치 등으로 인해, 문제가 생겨서 환경을 처음부터 다시 셋팅하고자 한다면, 새로운 가상환경을 만들면 된다.

다음 시간엔 오프라인으로 파이썬 패키지들을 다운받는 방법에 대해 학습해보도록 하자.

728x90
반응형
728x90
반응형

 Pycharm은 Python용 IDE(통합 개발 환경)로 많이 쓰이는 개발툴 중 하나로, 파이썬 개발툴 중 가장 높은 완성도를 가지고 있다는 특징이 있다.
(이외의 선택지는 Visual Studio에 파이썬 확장을 하는 것 말고는 없다.)

 

 

파이참을 설치해보자.

1. Google에 파이참을 검색해보자.

 

 

2. 파이참 Community 버전(공짜!!) 다운로드 클릭!

 

 

3. 파이참 설치를 진행해보자!

 

  • 설치 경로를 C 드라이브 바로 아래에 Pycharm 파일을 만들어서 그 곳으로 경로를 지정해주자.

  • 4가지 체크박스 모두를 체크해주도록 하자.
  • 바로가기, 폴더에서 프로젝트 바로 열기, PATH에 등록하기 등을 모두 선택.
  • Next > Install 을 눌러 설치해주도록 하자.

  • 설치가 완료 되었으면 Reboot now를 눌러 시스템을 재부팅해주자.

 

 

 

 

파이참을 실행하고 환경 셋팅을 해보자.

1. 파이참을 실행해보자.

  • 파이참을 설치할 때, JetBrains라는 파일에 들어가도록 이름을 정했었다(Default 값이므로, 위 설치 방법처럼 쭉쭉 진행했다면, 내가 언제 그랬지!? 하고 오해하지 않아도 된다.)

 

 

2. 환경을 셋팅을 해보자

  • 파이참 실행이 처음이므로 setting을 import하지 않고 시작하도록 하자.

 

  • 눈 보호를 위해, UI 테마를 어두운 화면인 Darucula로 선택하자

 

  • 여러가지 기능을 추가로 설치할 수 있다.
  • 본 환경에선 IdeaVim과 R 이 2가지를 설치해주도록 하겠다(개인적으로 R을 참 좋아한다.).
  • 위 과정이 끝나면 Start using PyCharm을 클릭하여 파이참을 본격적으로 실시해보자.

 

  • 본격적인 실행에 앞서서 Confiqure > Settings를 눌러서 개발 환경 설정을 실시하자.

 

  • Default Project > Project Interpreter에 들어가서 아나콘다를 기본 인터프리터(코드를 실행할 프로그램이라고 생각하면 간단하다.)로 설정하자.
  • 나사 모양을 누르고 Add를 해주자

 

  • 이전 포스트에서 만들었던 가상 환경을 그대로 사용하기 위해 위 와 같게 체크해주자
  • 마지막에 Click!!!!이라 쓰인 빨간 박스 안에 있는 버튼을 클릭하자

 

  • 만약 지금까지의 과정을 쭉 따라왔다면 다음과 같은 위치에 가상환경이 존재할 것이다.
  • C > Anaconda > envs > python.exe를 선택하자.
  • OK > OK > Apply > OK 를 눌러서 빠져나오자.

 

 

3. 새로운 프로젝트를 만들어보자.

  • 파이참은 Project 단위로 소스 파일들을 관리한다.

  • 새로 만든 Project의 이름을 정해주고
  • 방금 환경 셋팅에서 디폴트 Interpreter로 설정한 가상환경을 가지고 오기 위해 Existing interpreter를 체크해주자
  • Create로 가상환경을 생성하자.

 

  • 지금까지 잘 따라왔다면 Project 생성 시간이 꽤 걸릴 것이다.

 

  • 프로젝트에 우클릭 > Nex > Python File 을 실시하면 새로운 파이썬 파일이 생성된다.

 

  • 이번엔 Practice1.py로 새로운 파이썬 파일을 생성해보겠다.

 

  • print("Hello world")라고 타이핑하고, 마우스 우클릭 Run 버튼을 누르거나, Shift + F10을 하면 해당 파이썬 파일을 실행시킬 수 있다.

 

 

 

자 지금까지 윈도우에서 파이썬을 사용하기 위한 셋팅을 실시해보았다.

다음 포스트에서는 내가 필요로 하는 패키지를 다운로드 받는 방법에 대해 학습해보도록 하겠다.

728x90
반응형
728x90
반응형

지난 포스트에선 아나콘다 설치와 주피터 노트북 사용법에 대해 간략하게 훑어봤다.
이번 포스트에선 아나콘다의 특징 중 하나인 파이썬 가상환경에 대해 학습해보도록 하자.

 

 

 

가상환경(Virtual Environment)

  • 가상환경이란 말 그대로, 가상의 개발 환경으로, 대표적인 예시로 Virtual Box(VB)와 같은 툴을 통해 윈도우 안에 우분투, CentOS와 같은 다른 OS를 가상 머신에 설치하여, 기존 환경과 다른 환경을 구축하는 것을 말한다.
  • 앞서 다루었던 파이썬의 단점에서 의존성 문제로 인한 라이브러리의 충돌이 발생할 수 있다고 하였는데, 이 가상환경을 이용한다면, 조금 번거롭긴 하겠지만 python 버전 관리부터 패키지 충돌 방지를 동시에 만족할 수 있다.
  • 가상환경을 사용하면, 64 bit 환경에 대해서도 32 bit 환경에 대해서도 따로 환경을 만들어서, 다른 파이썬 설치 없이 쉽게 해결할 수 있다.
  • 즉, 가상환경을 만들면 파이썬의 버전과 라이브러리의 관리를 실제 환경과 별도로 만들어진 가상 속의 환경에서 해결할 수 있다는 것이다.

 

 

 

아나콘다에서 가상환경을 만들어보자.

1. 아나콘다 prompt를 실행하자.

 

 

2. Conda의 버전 확인과 update를 해주자.

  • conda --version
    : 아나콘다의 버전을 확인한다.
  • conda update conda
    : 아나콘다를 업데이트 한다.
  • 위 과정을 실시하면 맨 아래와 같이 Proceed ([y]/n)? 이라는 문구가 뜰 것이다. 여기서 y를 타이핑하고 엔터를 하자.

  • 위와 같은 결과가 나오며 Anaconda 버전 업데이트가 완료되었다.

 

 

3. 아나콘다의 가상환경을 생성해주자

  • conda create -n 가상환경이름 anaconda python=3 이라고 타이핑 쳐보자
  • python= 뒤에 들어가는 숫자는 python의 버전이다.
    (단순하게 python3를 쓰겠다면 python=3 이라고 해도 된다. 최신 버전이 설치되므로, 특정 버전이 필요한 경우 해당 버전을 정확히 적도록 하자.)
  • y를 입력하여, 가상환경 생성을 완료하도록 하자.

  • 가상환경 생성이 완료가 되면 간단하게 가상환경을 켜는 방법과 끄는 방법을 설명해준다. 이밖에 유용한 코드들을 정리해놓고자 한다.
  • conda activate 가상환경이름
    : 가상환경을 활성화하고자 하는 경우.
  • conda deactivate
    : 가상환경을 비활성화하고자 하는 경우.
  • conda env export > 가상환경이름.yaml
    : 가상환경을 내보내기(yaml 파일로 저장된다.)
  • conda env create -f 가상환경이름.yaml
    : 가상환경 불러오기
  • conda env list
    : 가상환경 리스트 출력
  • conda env remove -n 가상환경이름
    : 가상환경 제거하기

아래 내용은 가상환경 상태에서 치는 것을 추천한다.
(가상환경이 아닌 경우, conda 자체에 설치되서 가상환경을 사용할 수 있는 아나콘다의 장점을 활용할 수 없다.)

  • conda install 패키지이름
    : 가상환경에 특정 패키지를 설치하고자 하는 경우.
  • conda update 패키지이름
    : 패키지를 업데이트 하고자 하는 경우.
  • conda upgrade --all
    : 설치된 모든 패키지 업데이트
  • conda list
    : 설치된 패키지 목록 보기
  • conda remove 패키지이름
    : 패키지 제거

 

 

 

 

가상환경에서 파이썬을 다뤄보자.

  • 그다지 크게 쓸모 있는 부분은 아니지만 가상환경에서 파이썬을 사용해보자.

  • conda activate conda_virtual_env
    : 가상환경(conda_virtual_env) 활성화
  • python
    : python 실행
  • print("Hello world")
    : 파이썬을 비롯한 각종 프로그래밍 언어를 처음 다루게 되었을 때, 쳐볼 단어이다!
  • quit()
    : 파이썬 종료
  • conda deactivate
    : 가상환경 비활성화(deactivate라고 쳐도 된다.)
  • exit
    : conda prompt 종료

 

 

지금까지 아나콘다의 가상환경 만들기에 대해 학습해보았다.

위 방법을 사용하면, 얼마든지 내가 원하는 파이썬 버전에 맞는 가상환경을 만들고, 패키지 관리를 할 수 있다.

다음 포스트에서는 아나콘다를 보다 효율적으로 사용할 수 있도록, 아나콘다를 파이참에서 사용하는 법에 대해 학습해보도록 하겠다.

728x90
반응형

+ Recent posts