[Capstone Study] 머신러닝 완벽 가이드

[머신러닝] 섹션 1.3 넘파이 (1)

wlalsu_u 2023. 9. 21. 21:06

1.3.1 넘파이(NumPy) 란?

 

 

 

1)  Numercial Python 를 의미

2) 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지

 

 

 

- 많은 머신러닝 알고리즘이 넘파이를 기반으로 작성되어 있음

 

- 대량 데이터의 배열 연산을 루프를 사용하지 않고 수행하므로, 빠른 연산 속도를 보장

 

- C / C++ 과 같은 low level 언어 기반 호환 API 제공

 

- Python 의 수행 시간이 길기 때문에, 중요한 부분은 C / C++ 로 작성 후 넘파이에서 호출 (ex. 텐서플로)

 

- 데이터가 행과 열의 2차원 형태로 이루어져 다양한 가공, 변환 필요

 

- 따라서 판다스에 비해 편의성이 부족함

 

 

 

 


 

 

1.3.2 넘파이 ndarray 개요

 

 

 

먼저 넘파이 모듈을 import 하기 위해,

 

주피터 노트북을 생성하고 아래의 코드를 입력한다.

 

 

import numpy as np

 

 

'import numpy' 만 작성해도 괜찮지만, 약어를 관례적으로 사용한다.

 

 

 

 

 

 

 

ndarray 란?

 

- 넘파이의 기반 데이터 타입

 

- 다차원 배열을 쉽게 생성하고 다양한 연산 수행 가능

 

- array() 함수 : 다양한 인자를 입력받아서 ndarry 로 변환 ( = 파이썬 list)

 

 

 

 

np.array() 사용법

 

- ndarray로 변환하고자 하는 객체를 인자로 입력하면, ndarray 반환

 

- ndarray.shape : ndarray 차원과 크기를 튜플 형태로 반환

 

- 인자로 주로 파이썬 리스트 객체가 사용됨 (1차원 : [], 2차원: [[]])

 

 

 

 

 

np.array() 사용 예제는 다음과 같다.

 

 

 

 

 

 

 

 

np.array([1,2,3])

 

- 3개의 데이터를 가지고 있는 1차원 데이터

 

- shape 값은 (3,)

 

 

 

np.array([[1,2,3],[2,3,4]])

 

- 6개의 데이터를 가지고 있는 2차원 데이터

 

- 2개의 row와 3개의 column으로 구성됨

 

- shape 값은 (2,3)

 

 

 

np.array([[1,2,3]])

 

- 3개의 데이터를 가지고 있는 2차원 데이터

 

- 1개의 row와 3개의 column으로 구성됨

 

- shape 값은 (1,3)

 

 

 

 

 

shape 값을 확인해보면, [1,2,3] 과 [[1,2,3]] 모두 3개의 데이터를 갖고 있지만,
전자는 1차원, 후자는 2차원 데이터임을 확인할 수 있다.

 

 

 

머신러닝 알고리즘에서 특정한 차원을 요구하여 오류가 발생하는 경우가 있기 때문에,

 

차원의 차이를 이해하는 것이 중요하다. 

 

 

 

실제로 array 차원을 확인해보면 다음과 같다. 

 

 

 

 

 

 

 

 

 

 


 

 

 

1.3.3 ndarray의 데이터 타입

 

 

- ndarray 의 데이터 값은 숫자, 문자열, bool 모두 가능

 

- 숫자의 경우 int, unsigned int, float, complex (더 큰 숫자 값 또는 정밀도 위해) 타입 제공

 

- ndarray 내의 데이터 타입은 연산 특성상 같은 데이터 타입만 가능 

  ex) int 와 float를 함께 쓸 수 없음

 

- 데이터 타입은 dtype 으로 확인 가능

 

 

 

 

데이터 타입 확인을 위한 예제는 아래와 같다.

 

 

 

 

 

 

 

- list1 : int 값인 숫자 1, 2, 3을 가지고 있는 리스트

 

- np.array() 를 활용하여 ndarray 로 변환

 

- output을 확인해보면, 변환된 ndarray 의 데이터는 모두 int32 형인 것을 알 수 있음

 

 

 

 

 

만약, 다른 데이터 유형이 섞여 있는 리스트를 ndarray로 변경하면 어떻게 될까?

 

 

 

 

 

 

 

list2 = [1, 2, 'test']

 

 

- int 형과 문자열이 섞여 있는 list2 를 ndarray로 변환

 

- output을 확인해보면 int값이 모두 문자열 '1', '2' 로 변환됨

 

- 서로 다른 데이터 값이 섞여 있는 경우, 데이터 타입이 더 큰 데이터 타입으로 변환

 

 

 

list3 = [1, 2, 3.0]

 

 

- int 형과 float형이 섞여 있는 list3 를 ndarray로 변환

 

- output을 확인해보면 int값이 모두 float형 1., 2. 으로 변환됨

 

 

 

 

 

그렇다면, ndarray 내의 데이터 값의 타입을 변경할 수 있는 함수에 대해 알아보자.

 

 

 

astype() 메서드

 

 

- ndarray 내의 데이터 값의 타입 변경가능

 

- 인자로 원하는 타입의 문자열 지정

 

- 대용량 데이터의 ndarray 를 만들 때, 메모리를 절약하기 위해 주로 이용

 

 

 

 

 

astype() 메서드를 이용하여 'int32' 데이터를 'float64' 로 변환 후,

 

이를 다시 'int32' 로 변환하는 예제는 다음과 같다.

 

 

 

 

 

 

 

 

 

 

 


 

 

 

1.3.4 ndarray를 편리하게 생성하기 - arange, zeros, ones

 

 

 

 

테스트 데이터를 생성하거나, 대규모 데이터를 초기화할 때,

 

특정한 크기나 차원을 가진 ndarray 를 0 또는 1로 생성해야 하는 경우가 있다.

 

아래의 함수들을 하나씩 살펴보자.

 

 

 

 

1. arange()

 

 

- 파이썬 range() 함수와 유사

 

- 0부터 함수 인자 값(stop) -1까지의 값을 순차적으로 ndarray 데이터 값으로 변환

 

- start 값을 부여하여, 0이 아닌 다른 값부터 시작한 연속 값 부여 가능

 

 

 

 

 

 

위의 예시를 확인해 보면, default 함수 인자 stop 값이 10이므로,

 

-1을 더한 9까지의 연속 숫자 값을 가진 1차원 ndarray를 생성하는 것을 확인할 수 있다.

 

 

 

 

 

2. zeros()

 

 

- 인자로 튜플 형태의 shape 값을 입력하면, 모든 값을 0으로 채운 ndarray 반환

 

- 함수 인자로 dtype를 지정하지 않으면, default 값으로 float64 형의 데이터로 채움

 

 

 

 

 

 

 

3. ones()

 

 

- 인자로 튜플 형태의 shape 값을 입력하면, 모든 값을 1으로 채운 ndarray 반환

 

- 함수 인자로 dtype를 지정하지 않으면, default 값으로 float64 형의 데이터로 채움

 

 

 

 

 

 

 

 


 

 

 

1.3.5 ndarray의 차원과 크기를 변경하는 reshape()

 

 

 

 

reshape() 메서드

 

 

- ndarray를 특정한 차원, 크기로 변환

 

- 함수 인자로 변환을 원하는 크기를 부여

 

- 지정된 사이즈로 변경이 불가능한 경우 오류 발생

 

 

 

 

reshape() 메서드를 사용하여 array를 변경하는 예제는 다음과 같다.

 

 

 

 

 

 

 

 

인수로 지정된 사이즈로 변경이 불가능하여 오류가 발생하는 경우 예제는 다음과 같다.

 

 

 

 

 

 

오류 메시지를 확인해보면, size10을 (4,3) shape으로 변경할 수 없다고 뜬다.

 

 

 

 

그렇다면, 이러한 오류를 발생시키지 않고 실전에서 더욱 효율적으로 사용하는 방법을 알아보자.

 

 

 

인자로 -1을 적용하는 경우, ndarray와 호환되는 새로운 shape로 변환시켜준다. 

 

 

 

아래의 예시를 살펴보자.

 

 

 

 

 

 

1) array1.reshape(-1, 5)

 

 

 

- array1 은 0~9까지의 데이터를 가지고 있는 1차원 ndarray

 

- row값을 -1, column값을 5로 reshape 하면, 고정된 5개의 column에 맞는 row를 자동으로 생성

 

- 따라서 2 * 5의 2차원 ndarray로 자동 변환

 

 

 

 

2) array1.reshape(5, -1)

 

 

 

- array1 은 0~9까지의 데이터를 가지고 있는 1차원 ndarray

 

- row값을 5, column값을 -1로 reshape 하면, 고정된 5개의 row에 맞는 column을 자동으로 생성

 

- 따라서 5 * 2의 2차원 ndarray로 자동 변환

 

 

 

 

 

하지만 -1을 사용하더라도, 호환될 수 없는 형태로는 변환이 불가능하다.

 

아래의 예시처럼 10개의 1차원 데이터를 4개의 고정 column으로 변경하는 경우 에러가 발생한다. 

 

 

 

 

 

 

 

 

 

실제 -1 인자는 reshape(-1, 1) 과 같은 형태로 주로 이용된다.

 

 

reshape(-1, 1) 은 원본 ndarray가 어떤 형태이더라도, 
2차원이여서 여러개의 row를 가지지만, 반드시 1개의 column을 가진 ndarray 를 변환한다.

 

 

 

아래의 예제는 reshape(-1, 1)을 이용하여

 

3차원을 2차원으로, 1차원을 2차원으로 변경하는 예시이다.

 

 

이때, tolist() 메서드는 ndarray를 리스트 자료형으로 변환한다. (출력을 시각적으로 더 쉽게 이해하기 위해)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

권철민 '파이썬 머신러닝 완벽 가이드 (개정2판)' 책을 기반으로 작성하였습니다.