본문 바로가기

언어/Python

[개념] Python Numpy에 대해 이해해보자 3 (array 데이터자료형, 자료형 지정, 형식 변환, 기본 자료형과 Numpy 자료형의 차이)

rfriend.tistory.com/285?category=675917

 

[Python NumPy] ndarray 데이터 형태 지정 및 변경 (Data Types for ndarrays)

이번 포스팅에서는 Python의 NumPy 모듈을 사용해서  - 데이터 형태 지정 (assign data type) :  - 데이터 형태 확인 (check data type)  - 데이터 형태 변경 (convert data type) 하는 방법을 소개하겠습니다..

rfriend.tistory.com

(오늘의 공부내용은 위 블로그의 내용을 그대로 참고했습니다.)


Numpy 패키지는 수치해석을 위한 라이브러리인만큼 숫자형 자료형을 더욱 자세히 나누어 놓은 자료형이 존재한다.

 

같은 int형이지만 뒤에 bit 단위가 붙게 되는데 예를들어 int8이면 2^8개의 즉 256개만큼의 정수를 표현할 수 있다고 한다.

 

int8은 -128~127

int16은 -32,768~32,767

int32, int64도 모두 이런 방식으로 정수를 표현할 수 있다.

 

근데 정확히 왜 비트까지 나눠서 표현하는지 이해하지 못했다.

 

여튼 Numpy는 구체적인 숫자형을 나누어 패키지에서 다룰 수 있도록 만들었다는 선에서 이해하면 될 것 같다.

 

그래서 array로 나타낼 수 있는 자료형은

 

<Numpy 자료형>

 

1. 정수형

(정수형) int - int8, int16, int32, int64

(0을 포함한 양수 정수형) uint - uint8, uint16, uint32, uint64

 

2. 실수형

float - float16, float32, float64

 

3. 복소수형

complex - complex64, complex128

 

4. 논리형

boolean - bool_ 혹은 bool

 

5. 문자형

string - string_

 

이렇게 5가지 종류로 나뉜다.

 

앞서 말했든 뒤에 붙는 숫자는 비트를 의미하는 것으로 각 비트마다 저장가능한 수가 다르다.


이제 데이터형을 지정해주어 array를 생성하는 법을 보자.

 

1. Array 클래스 생성하면서 dtype = ''으로 자료형 지정

 

np.array([~], dtype = np.자료형)

#Numpy Array 자료형 지정
import numpy as np

a = np.array([11,24,35], dtype = np.int8)
a.dtype

(참고로 array 내의 자료형 확인은 .dtype으로 가능하다)

 

array 클래스 안에 int8로 dtype을 지정해주었다.

 

int8형은 2^8 = 256개의 정수형 즉 -127~128의 정수만 표현 가능하다고 했다.

 

만약 이 범위 안에 포함되지 않는 정수의 dtype을 int8로 지정해준다면 어떻게 될까?

#만약 해당 비트 안에 포함되지 않는 숫자를 지정할 경우
#320은 -127~128 안에 속하지 않으므로 int8이 표현할 수 없음
b = np.array([320,11,23], dtype = np.int8)
b

320->64로 변경되었다.

320은 int8 타입 안에 속하지 않는 정수여서 int8 안의 숫자로 변경됨을 확인할 수 있었다.

 

320-256 = 64임을 생각하면 아마 128을 넘는 수부터는, 즉 129부터는 다시 -127로 숫자가 부여되는 것 같다.

 

실제로 내 추측이 맞았다.


1-1. dtype = 에 각 자료형의 코드 입력해서 지정하기 np.array([~], dtype = '코드')

 

각 자료형마다 코드가 부여되어있는데 그 코드를 입력해서 자료형을 지정해줄 수도 있다.

 

코드명은 int->i, uint->u, float->f, complex->c로 줄고,

 

뒤의 비트는 8->1, 16->2, 32->4, 64->8, 128->16. 즉 8로 나눈 숫자가 된다.

 

그래서 만약 int8의 코드를 입력하고 싶다면 i1, complex128의 코드를 입력하고 싶다면 c16 이렇게 기억할 수 있다.

 

#Numpy 자료형 지정 using code

a = np.array([1.1, 3.2, 5.3], dtype = 'f2')
a.dtype

 

float16의 코드 f2를 입력해 지정


1-2. array함수 따로 안 쓰고 바로 적용  ##np.자료형([리스트]) ##

 

#array 함수 안 쓰고 np.자료형([list])로 바로 array에 형식까지 지정하기

b = np.float16([1.1, 2.2, 3.3])
b.dtype

type(b)

b

array클래스가 바로 생성되었고, 그 자료형도 우리가 지정한대로 생성되었다.


2. 데이터형변환 .astype(np.자료형)

 

자료형을 변환하고 싶을 때는 .astype을 사용한다.

 

이는 numpy의 자료형뿐 아니라 다른 자료형 모두에도 해당된다.

 

#자료형 변환 .astype(np.자료형)
c = b.astype(np.int8)
c

 

1.1, 2.2, 3.3의 실수형을 갖던 b에 .astype을 적용해서 int8형인 array c를 생성했다.

만약 string으로 변환하고 싶다면 .astype(np.string_) 으로 자료형 끝에 언더바를 입력하는 것을 잊지 말자.


3. Python의 int와 Numpy의 int64 비교

 

Python의 기본 자료형인 int형과 Numpy의 자료형인 int64는 사용할 수 있는 연산자, methods와 attributes에 큰 차이가 있다고 한다.

 

이것은 dir(데이터) 함수로 사용할 수 있는 연산자, methods, attributes를 찾을 수 있다고 한다.

 

#int와 int64 비교
#int
x = 1
x_d = pd.DataFrame(dir(x))
x_d.shape

#int와 int64비교
#int64
x_64 = np.int64(1)
x_64_d = pd.DataFrame(dir(x_64))
x_64_d.shape

int형은 71개, int64형은 136개로 int64형이 int형보다 65개 더 많은 methods와 attributes, 연산자를 사용할 수 있었다.


오늘은 Numpy의 Array 클래스에서 사용가능한 자료형에 대해 이해하고, 자료형을 지정하는 방법 세가지와 자료형 변환 함수인 .astype(np.자료형)을 살펴보았다.

 

그리고 맨 마지막으로 기본 자료형인 int와 numpy의 자료형인 int64의 차이를 알아보았다.

 

오늘 배운 방식대로 기본자료형과 numpy 자료형을 구분해서 사용하게 될지는 모르지만, 적어도 이런 차이점이 있어서 Numpy 라이브러리가 수치계산에 더 많이 활용된다는 점을 이해할 수 있던 것만으로도 오늘의 공부는 큰 수확이었다.

 

Numpy 라이브러리에서 중요한 개념들은 다 살펴본 것 같은데 다음 공부할 내용은 좀 더 고민해봐야겠다.