본문 바로가기

머신러닝 공부

NumPy (넘파이)

SMALL

넘파이에 대해서 공부해보겠습니다. 먼저 넘파이의 뼈대를 이루고 있는 ndarray에 대해서 알아보겠습니다.

여기서 nd가 각각 의미하는 것은 N 차원 (Dimension) 으로 ndarray는 N차원 배열 객체라는 의미입니다.

한 차원이 높아질때마다 한차원 밑에 있는 요소들을 원소로 가지는 형태의 배열입니다.

 

넘파이에는 array라는 함수가 있는데 이 안에 우리가 변환하고자하는 데이어 타입을 넣어주면 됩니다.

Numpy 모듈의 array() 함수로 생성하여 인자로 주로 파이썬 list 또는 ndarray를 입력하여 줍니다.

import numpy as np
array1 = np.array([1,2,3])
array2 = np.array([1,2,3],[2,3,4])

원래 list로 대용량 데이터 처리는 어려움을 겪게 됩니다. 하지만 넘파이는 vector processing이 되기 때문에 굉장히 빠르게 처리를 할 수 있게 됩니다. 따라서 다량의 데이터를 처리하게 될 때 파이썬의 list를 ndarray로 바꿔서 처리하는게 용이합니다.

 

보통 numpy모듈을 import 시킬 때 numpy라고 전부 쓰지 않고 np 축약어를 많이 쓰기 때문에 np를 넘파이로 표현합니다.

 

 

ndarray Shape (형태)와 차원

array 차원 Shape
[1, 2, 3] 1차원 ?
[[1, 2, 3],
[4, 5, 6]]
2차원 (2, 3)

2차원부터 보겠습니다. 배열이 다음과 같이 있다고 가정할 때 shpe라는 속성을 알고 싶어 보자면 (2, 3)으로 나온걸 보면 앞의 2가 행, 3이 열을 의미합니다.

만약 2차원 배열을 우리가 array2D라는 이름으로 저장을 시키고 array2D.shape의 반환값은 (2, 3)이 되는 것입니다.

그럼 1차원을 보겠습니다. 그럼 shape가 (3)이라는 것을 유추할 수 있지만 실제로 반환 값을 본다면 (3,)으로 표기가 됩니다. (콤마가 있음을 반드시 알아야 합니다. => shape안에 맨 마지막에 컴마가 붙으면 무조건 1차원 입니다

 

 

ndarray 타입(type)

ndarray 내부 데이터 타입은 무조건 같아야 합니다.

일반 배열과 같이 데이터 타입은 정수형 (1, 2...) , 실수형(1.1, 2.1....) , 문자열( '홍길동', '임꺽정'....), boolean형 (True False..) 등과 같이 나타낼 수 있습니다. ndarray 내의 데이터 타입은 그 연산의 특성과 같은 데이터 타입만 가능하게 하는 것을 알아야만 합니다 즉, 한 개의 ndarray 객체에 int와 float가 함꼐 있을 수는 없습니다.

ndarray내의 데이터 타입은 ndarray.dtype으로 확인할 수 있습니다.

 

* nd.array = [1, 0.9] 는 불가하지만, nd.array([1,0.9])는 가능합니다. => 이때는 실수형이 데이터 타입이 더 크기 때문에 형변환을 자동으로 하여 1이 1.0 실수형으로 형변환을 하게 됩니다.

 

astype()을 이용하여 변환을 ndarray타입을 변환시킬 수 있습니다.

변경을 원하는 타입을 astype() 에 인자로 입력하면 됩니다. 대용량 데이터를 ndarray로 만들 때 메모리를 절약하기 위해 주로 사용됩니다. 0,1,2와 같이 크지 않은 범위의 숫자를 위해서 64bit  float 형 보다는 8 bit 또는 16 bit의 integer 형으로 변환하는 것이 훨씬 메모리를 많이 절약하게 됩니다.

import numpy as np

list1 = [1, 2, 3]
print('list1 type:', type(list1))
array1 = np.array(list1)
#array1 = np.array([1,2,3])
print('array1 type:',type(array1))
print('array1 array 형태:',array1.shape)

array2 = np.array([[1,2,3],
                  [2,3,4]])
print('array2 type:',type(array2))
print('array2 array 형태:',array2.shape)

array3 = np.array([[1,2,3]])
print('array3 type:',type(array3))
print('array3 array 형태:',array3.shape)

다음과 같은 코드를 실행시킨다고 가정을 해보자면, output은 다음과 같이 나오게 됩니다.

list1 type: <class 'list'>
array1 type: <class 'numpy.ndarray'>
array1 array 형태: (3,)
array2 type: <class 'numpy.ndarray'>
array2 array 형태: (2, 3)
array3 type: <class 'numpy.ndarray'>
array3 array 형태: (1, 3)

 

array1 : 1차원, array2와 array3는 2차원인것을 알 수 있습니다. (array3이 2차원인걸 잘 보면 리스트를 요소로 가진 배열이란 걸 확인하면 됩니다.)

 

 

 

이제 astype을 이용한 형변환 및 ndarray의 데이터타입을 dtype을 이용하여 확인하는 실습을 하겠습니다.

array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64') # array_int.astype(np.float64)
print(array_float, array_float.dtype)

array_int1= array_float.astype('int32')
print(array_int1, array_int1.dtype)

array_float1 = np.array([1.1, 2.1, 3.1])
array_int2= array_float1.astype('int32')
print(array_int2, array_int2.dtype)

이에 따른 output은 다음과 같습니다.

[1. 2. 3.] float64
[1 2 3] int32
[1 2 3] int32

astype을 이용해서 float64, int32 등 다양한 형변환을 보였으며 dtype을 통해서 형 변환후에 데이터 타입이 제대로 벼환이 됐는지 결과를 통해 확인할 수 있었습니다.

LIST