Reshape

 shape의 크기를 바꿔준다.

arr = np.array([1,2,3], [1,2,3])
arr.shape # (2, 3)
arr = arr.reshape([1,6])
arr.shape # (1, 6)

Reshape, -1 활용

arr = np.array([[1,2,3], [1,2,3]])
arr.shape # (2, 3)
arr = arr.reshape(-1)
arr.shape # (6, )

 

Ravel

 배열의 차원을 1차원으로 바꿔준다. 

 arr.reshape(-1)과 같다.

arr = np.array([[1,2,3], [1,2,3], [1,2,3]])
arr = arr.ravel()
arr.shape # (9, )

 

Expand_dims()

 안의 값은 유지하되 차원 수를 늘릴 때 사용한다.

arr = np.array([[1,2,3], [1,2,3], [1,2,3]])
arr.shape # (3, 3)
arr = np.expand_dims(arr, -1)
arr.shape # (3, 3, 1)
arr = np.expand_dims(np.expand_dims(arr, -1), 0)
arr.shape # (1, 3, 3, 1, 1)

 

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - 배열 생성 및 데이터타입  (0) 2021.01.13
Tensor 이해하기  (0) 2021.01.09

NumPy

행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리이다.

데이터 구조 외에도 수치 계산을 위해 효율적으로 구현된 기능을 제공한다.

 

NumPy 예제

배열 생성

array

import numpy as np

arr = np.array([1, 2, 3]) # array([1,2,3])
arr2 = np.range(10) # array([1,2,3,4,5,6,7,8,9])

 

Random array 생성 random.randn

arr = np.random.randn(3, 3)
arr
# array([[ 1.60158672,  1.17769594, -0.79191802],
#       [ 0.54598717,  0.15090111, -1.33924214],
#       [ 0.10766564, -0.86054647,  1.1948043 ]])

zeros

0으로 채워진 numpy array를 만든다.

zeros = np.zeros([2, 3])
zeros # array([[0., 0., 0.], [0., 0., 0.]])

ones

1로 채워진 numpy array를 만든다.

ones = np.ones([2, 3])
zeros # array([[1., 1., 1.], [1., 1., 1.]])
ones * 5 # array([[5., 5., 5.], [5., 5., 5.]])

 

Data Type

dtype

배열 타입 확인

arr = np.array([1,2,3])
arr.dtype # dtype('int64')

astype()

배열 타입 변경

arr = np.array([1,2,3])
arr.astype(np.int32)
arr.dtype # dtype('int32')

배열을 선언할 때 타입도 선언해줄 수 있다.

arr = np.array([1,2,3], dtype=np.uint8)
arr.dtype # dtype('uint8')

shape

차원의 갯수 확인

arr = np.array([[1,2,3], [1,2,3]])
arr.shape # (2, 3) value값이 3개인 배열이 2개가 있다는 뜻

ndim

배열의 차원 확인

arr = np.array([[1,2,3], [1,2,3], [4,5,6]])
arr.shape # (3, 3)
arr.ndim # 3

size

배열 크기 확인 

arr = np.array([[1,2,3], [1,2,3], [4,5,6]])
arr.shape # (3, 3)
arr.size # 9

 

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13
Tensor 이해하기  (0) 2021.01.09

스택이란?

스택은 사전적의미로 "쌓다", "더미"라는 의미를 가지고 있다.

메모리의 스택 영역은 함수의 호출과 관계되는 지역번수, 매개변수, 리턴값 등의 임시데이터를 저장한다.

 

스택의 구조

스택은 LIFO(Last In, First Out 후입선출)구조의 데이터 관리 방식을 따른다.

   - LIFO: 마지막에 넣은 데이터를 가장 먼저 추출하는 데이터 관리 정책

   - FILO: 처음에 넣은 데이터를 가장 마지막에 추출하는 데이터 관리 정책

데이터를 제한적으로 접근할 수 있는 구조

   - 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조

스택의 주요 기능

   - push(): 데이터를 스택에 넣음

   - pop(): 데이터를 스택에서 추출

 

위 그림에서 2를 push하게 되면 스택에 쌓이게 되고 그림의 흐름처럼 3, 4, 5, 6이 차례대로 스택에 쌓이게 된다.

이후 pop을 하면 쌓였던 데이터중에 가장 나중에 쌓인 6이 가장 먼저 추출이 되고 계속 추출을 하면 가장위에 있는 데이터가 추출되게 된다.

 

스택의 장점

구조가 단순해서 구현이 쉽다.

데이터 저장/읽기 속도가 빠르다.

 

스택의 단점

데이터 최대 갯수를 미리 정해야 한다.

저장 공간의 낭비가 발생할 수 있다.(미리 최대 갯수만큼 공간을 확보해야함)

 

파이썬 리스트기능에서 제공하는 메서드로 스택 구현

list_stack = list()

list_stack.append(1) #리시트에 append메소드를 이용해 데이터를 쌓는다.
list_stack.append(2)
list_stack.pop() #가장 마지막에 입력된 2가 추출된다.

 

파이썬으로 push, pop함수 구현하기

list_stack = list() #리스트 선언

def push(data):
	list_stack.append(data) #push에 데이터를 입력받아 스택에 쌓아준다.
    
def pop():
	data = list_stack[-1] #후입선출구조이기 때문에 마지막데이터를 data변수에 입력해준다.
    del list_stack[-1]    #리스트의 마지막데이터를 삭제해준다.
    return data           #마지막으로 저장한 데이터를 리턴해줘서 사용자에게 어떤수가 사라졌는지 보여준다.
   
for i in range(10):
	push(i) #0~9까지 수를 스택에 쌓아준다.
    
pop() #마지막으로 쌓인 9가 추출된다.

Tensor

사전적의미로는 벡터의 확장 개념. 수학/물리학에서 중요한 역할을 하는 텐서는 백터의 개념을 포함한다.

딥러닝에서 주로 과원적인 데이터를 많이 사용하게되어 Tensor라는 개념이 많이 나오게되어 개념을 이해하는 것이 중요하다.

Numpy는 그런 고차원적인 데이터를 다루기 쉽게 만들어져있어 딥러닝을 하게 된다면 늘 접하게 될 것이다.

 

0차원

numpy array는 1 또는 5, 10 과 같이 숫자 데이터를 array화 시켜줄 수 있다.

Scalar로 들어갔을 때는 shape가 아무것도 없는 것으로 나온다.

   *Scalar: 실수 전체 집합에 속하는 특정 값*

import numpy as np
arr = np.array(5) #numpy에서 배열을 생성하는방법
arr.shape #Scalar로 들어갔을 때는 shape이 나오지않는다.
arr.ndim #배열의 차원을 리턴해줌 여기서는 0을 리턴

 

1차원

숫자가 10과 같이 하나만 들어간다고 해도 [] 리스트를 한번 씌우게 되면 차원이 생긴다.

이때 1차원이 되는건데 numpy에서 shape을 표현할 때 (1)이 아닌 (1,)과 같은 방식으로 표현한다.

(3,)에서 3은 값이 아닌 shape을 나타내는 것을 명심해야한다.

arr = np.array([3])
arr.shape #(1,)
arr = np.array([1,2,3])
arr.shape #(3,) 1차원배열에 3개의 값이 들어갔다는 의미이다.

 

2차원

대괄호를 추가적으로 씌우면 차원이 추가로 하나생긴다.

arr = np.array([[1,2,3]])
arr.shape #(1, 3)
arr = np.array([[1,2,3], [1,2,3], [1,2,3]])
arr.shape #(3, 3)

*참고: 0차원 숫자에 대괄호를 2번씌우면 2차원이 된다.

 

다차원

arr = np.array([[[1], [2], [3]], [[1], [2], [3]], [[1], [2], [3]]])
arr.shape #(3, 3, 1)

 

'Python > NumPy' 카테고리의 다른 글

NumPy - Math Function  (0) 2021.01.13
NumPy - Broadcast  (0) 2021.01.13
NumPy - Indexing, Slicing  (0) 2021.01.13
NumPy - shape 및 차원 변경  (0) 2021.01.13
NumPy - 배열 생성 및 데이터타입  (0) 2021.01.13

큐(Queue)란

 

큐의 구조

줄을 서는 행위와 유사하다.

가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조이다.

    - 버스정류장에서 가장 먼저 줄을 선 사람이 가장 먼저 버스에 타는 것과 동일하다.

    - FIFO(First-In, First-Out) 또는 LILO(Last-In, Last-Out)방식으로 스택과 꺼내는 순서가 반대이다.

출처: http://www.stoimen.com/blog/2012/06/05/computer-algorithms-stack-and-queue-data-structure

 

큐의 용어

Enqueue: 큐에 데이터를 넣는 기능

Dequeue: 큐에서 데이터를 꺼내는 기능

 

파이썬 queue 라이브러리를 활용하여 자료구조 사용하기

queue라이브러리에는 다양한 큐 구조로 Queue(), LifoQueue(), PriorityQueue()를 제공한다.

    - Queue(): 가장 일반적인 큐 자료구조

import queue

d_queue = queue.Queue() # d_queue를 Queue()를 통해 기본큐로 선언
d_queue.put('hello') #put을 이용하여 d_queue에 데이터 추가
d_queue.put(10)
d_queue.get() #get을 이용하여 데이터를 가져온다. 여기서 나오는 출력문은 hello가 된다.

    - LifoQueue(): 나중에 입력된 데이터가 먼저 출력되는 구조(스택구조와 같음)

import queue

d_queue = queue.LifoQueue() #LifoQueue를 통해 LIFO큐를 선언
d_queue.put('hello') #Queue함수로 선언한것과 동일하게 put으로 데이터 삽입
d_queue.put(30)
d_queue.get() #FIFO와 반대로 LIFO는 마지막으로 들어간 데이터가 먼저나오기때문에 출력문은 30

    - PriorityQueue(): 데이터마다 우선순위를 부여하여 우선순위가 높은 순서대로 데이터를 출력한다.

import queue

d_queue = queue.PriorityQueue()
d_queue.put((3, 'hello')) #PriorityQueue는 튜플로입력받고 첫번째에는 우선순위 두번째에 데이터를 입력한다.
d_queue.put((5, 100))
d_queue.put((15, 'world'))
d_queue.get() #우선순위가 가장 낮은수를 출력하기 때문에 출력문은 (3, 'hello')가 된다.

 

파이썬 라이브러리를 사용하지않고 enqueue, dequeue구현

list_q = [] #리스트 선언

def enqueue(data):

    list_q.append(data) #추가하고싶은 데이터를 입력하면 리스트에 추가

def dequeue():

    data = list_q[0] #리스트의 0번째 데이터를 data에 대입
    del list_q[0]    #리스트의 0번째 데이터를 삭제
    return data      #data를 리턴해줌으로 삭제된 데이터를 보여준다.

배열(Array)이란

데이터를 나열하고, 각 데이터를 인덱스에 대응하도록 구성한 데이터 구조이다.

파이썬에서는 리스트 타입이 배열 기능을 제공하고 있다.

 

배열이 필요한 이유

같은 종류의 데이터를 효율적으로 관리하기 위해 사용한다.

같은 종류의 데이터를 순차적으로 저장한다.

 

배열의 장점

빠른 접근 가능(인덱스를 이용하여 순차적 접근이 아닌 찾고자하는 데이터의 인덱스만 알면 바로 찾을 수 있다.)

 

배열의 단점

추가/삭제가 쉽지않다.

미리 최대 길이를 지정해야 한다.

 

파이썬과 C언어 배열 예제

C언어

#include <stdio.h>

int main(int argc, char* argv[])
{
    char country[3] = "US";
    printf("%c%c\n", country[0], country[1]);
    printf("%s \n", country);
    return 0;
}

Python

country = 'US'
print(country)

country = country + 'A'
print(country)

파이썬은 C언어와 다르게 배열의 최대길이를 설정해주지 않는데 이것은 파이썬에서 리스트를 이용해 배열을 만들기 때문이다.

 

파이썬 리스트를 활용한 배열

# 1차원 배열: 리스트로 구현시
data = [1, 2, 3, 4, 5]

# 2차원 배열: 리스트로 구현시
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

 

 

 

자료구조(데이터구조, data structure)란

자료(Data)란 현실 세계로부터 수집한 사실이나 개념의 값 또는 이들의 집합을 의미한다.

자료구조(Data Structure)란 자료의 집합을 의미하며 각 원소들 사이의 관계가 논리적으로 정의된 일정한 규칙에 의하여 나열되며 자료에 대한 처리를 효율적으로 수행할 수 있도록 자료를 조직적으로 구분하여 표한한 것을 말한다.

즉 대량의 데이터를 효율적으로 관리할 수 있는 데이터의 구조를 의미한다.

 

자료구조의 선택 기준

작업의 효율성, 추상화, 재사용성을 증가시키기 위해 상황에 맞는 적절한 자료구조를 사용해야한다.

자료 처리를 효율적으로 하기위한 고려사항

 자료의 처리시간

 자료의 크기

 자료의 활용 빈도

 자료의 갱신 정도

 프로그램의 용이성

 

효율적으로 데이터를 관리하는 예

우편번호: 5자리 우편번호로 국가의 기초구역을 제공

학생관리: 학년, 반 번호를 학생에게 부여해 학생부를 관리

 

대표적인 자료구조

배열, 스택, 큐, 링크드 리스트, 해쉬 테이블, 힙 등

 

 

알고리즘이란

어떤 문제를 풀기 위한 절차 / 방법

어떤 문제에 대해, 특정한 입력을 넣으면 원하는 출력을 얻을 수 있도록 만드는 프로그래밍

 

알고리즘의 판단 기준

 처리 시간

 저장공간활용

 

 

어떠한 자료구조와 알고리즘을 쓰느냐에 따라, 성능의 차이가 심하기 때문에 자료구조와 알고리즘은 중요하다.

 

 

ps, 자료구조와 알고리즘은 어떤 언어로든 익힐 수 있다.

      이전에는 무조건 C또는 C++ 로만 작성하도록 하는경우가 많았지만 최근에는 언어로 인한 제약/평가가 없어짐

+ Recent posts