rfriend.tistory.com/285?category=675917
(오늘의 공부내용은 위 블로그의 내용을 그대로 참고했습니다.)
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으로 가능하다)
int8형은 2^8 = 256개의 정수형 즉 -127~128의 정수만 표현 가능하다고 했다.
만약 이 범위 안에 포함되지 않는 정수의 dtype을 int8로 지정해준다면 어떻게 될까?
#만약 해당 비트 안에 포함되지 않는 숫자를 지정할 경우
#320은 -127~128 안에 속하지 않으므로 int8이 표현할 수 없음
b = np.array([320,11,23], dtype = np.int8)
b
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
1-2. array함수 따로 안 쓰고 바로 적용 ##np.자료형([리스트]) ##
#array 함수 안 쓰고 np.자료형([list])로 바로 array에 형식까지 지정하기
b = np.float16([1.1, 2.2, 3.3])
b.dtype
type(b)
b
2. 데이터형변환 .astype(np.자료형)
자료형을 변환하고 싶을 때는 .astype을 사용한다.
이는 numpy의 자료형뿐 아니라 다른 자료형 모두에도 해당된다.
#자료형 변환 .astype(np.자료형)
c = b.astype(np.int8)
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
오늘은 Numpy의 Array 클래스에서 사용가능한 자료형에 대해 이해하고, 자료형을 지정하는 방법 세가지와 자료형 변환 함수인 .astype(np.자료형)을 살펴보았다.
그리고 맨 마지막으로 기본 자료형인 int와 numpy의 자료형인 int64의 차이를 알아보았다.
오늘 배운 방식대로 기본자료형과 numpy 자료형을 구분해서 사용하게 될지는 모르지만, 적어도 이런 차이점이 있어서 Numpy 라이브러리가 수치계산에 더 많이 활용된다는 점을 이해할 수 있던 것만으로도 오늘의 공부는 큰 수확이었다.
Numpy 라이브러리에서 중요한 개념들은 다 살펴본 것 같은데 다음 공부할 내용은 좀 더 고민해봐야겠다.