(파이썬 머신러닝 완벽 가이드 Chap 01.03)
머신러닝의 주요 알고리즘 - 선형대수와 통계에 기반
NumPy (Numerical Python) - 선형대수 기반의 프로그램을 만들수 있도록 지원하는 패키지
루프를 사용하지 않고 대량 데이터의 배열 연산을 가능하게 하므로 빠른 배열 연산 속도를 보장
C/C++과 같은 저수준 언어 기반의 호환 API 제공 → 수행 성능이 중요한 부분은 C/C++ 기반으로 작성하고 이를 NumPy에서 호출하는 방식으로 통합 가능
NumPy를 이해하는 것은 Python 기반 Machine Learning 에서 매우 중요
import numpy as np
as np 를 이용해 약어로 모듈을 표현해주는 것이 좋다.
ndarray는 NumPy의 기반 데이터 타입으로, 다차원 배열을 쉽게 생성하고 연산할 수 있다.
array1 = np.array([1, 2, 3])
print('array1 type:', type(array1))
print('array1 array shape:', array1.shape)
array2 = np.array([[1, 2, 3],
[2, 3, 4]])
print('array2 type:', type(array2))
print('array2 array shape:', array2.shape)
array3 = np.array([[1, 2, 3]])
print('array3 type:', type(array3))
print('array3 array shape:', array3.shape)
output
array1 type: <class 'numpy.ndarray'>
array1 array shape: (3,)
array2 type: <class 'numpy.ndarray'>
array2 array shape: (2, 3)
array3 type: <class 'numpy.ndarray'>
array3 array shape: (1, 3)
np.array() 에 객체를 인자로 입력하면 ndarray로 변환해서 반환.
ndarray.shape는 ndarray의 차원과 크기를 tuple로 나타낸다. (#row, #column)
array1과 array3 의 차이를 이해하는 것이 중요하다.
array1은 1차원 데이터로, (3, )의 shape을 가지고, array3는 2차원 데이터로 (1, 3)의 shape을 가진다.
머신러닝 과정에서 1차원 데이터나 다차원 데이터를 명확히 필요로 하는 경우가 있기 때문에, 데이터값은 동일해도 차원이 달라 오류가 발생하는 경우가 빈번하다. 이 경우 차원의 차수를 변환하는 것이 필요하다 (reshape() 함수 사용)
print('array1: {:0}차원, array2: {:1}차원, array3: {:2}차원'.format(array1.ndim, array2.ndim, array3.ndim))
output
array1: 1차원, array2: 2차원, array3: 2차원
ndarray.ndim을 이용해 ndarray의 차원을 확인할 수 있다
ndarray의 shape는 행, 렬, 높이 단위로 부여되는 것이 아니라, axis 0, axis 1 과 같이 axis 단위로 부여된다.
이때, axis 0은 행을 세는 방향(row1, row2, row3, ...)
axis 1은 열을 세는 방향 방향(column1, column2, column3, ...)이다.
array2 = np.array([[1, 2, 3],
[2, 3, 4]])
print(array2.sum())
print(array2.sum(axis=0))
print(array2.sum(axis=1))
output
15
[3 5 7]
[6 9]
ndarray 내의 데이터 값은 숫자 값, 문자열 값, 불 값 등이 모두 가능.
그러나, ndarray내의 데이터 타입은 같은 데이터 타입만 가능. 즉, 한개의 ndarray 객체에 int 와 float이 함께 있을 수 없다.
dtype 속성으로 ndarray 내의 데이터 타입을 확인 가능하다.
list1 = [1, 2, 3]
print(type(list1))
array1 = np.array(list1)
print(type(array1))
print(array1, array1.dtype)
output
<class 'list'>
<class 'numpy.ndarray'>
[1 2 3] int32
만약 다른 타입의 데이터가 섞인 리스트를 ndarray로 변환하면 데이터 크기가 더 큰 데이터 타입으로 형 변환을 일괄적용한다.
list2 = [1, 2, 'test']
array2 = np.array(list2)
print(array2, array2.dtype)
list3 = [1, 2, 3.0]
array3 = np.array(list3)
print(array3, array3.dtype)
['1' '2' 'test'] <U11
[1. 2. 3.] float64
astype() 메서드를 이용하면 ndarray 내 데이터값의 타입 변경이 가능하다.
astype() 메서드는 메모리를 절약할 때 보통 이용된다. (ex. float64 -> int32)
아래의 예제는 int32를 float64로 변경하고, 다시 int32로 변경한다.
또한, 마지막 예제에서는 float을 int로 변경할 때 소수점 이하가 없어지는 것을 볼 수 있다.
array_int = np.array([1, 2, 3])
array_float = array_int.astype('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_float.astype('int32')
print(array_int2, array_int2.dtype)
output
[1. 2. 3.] float64
[1 2 3] int32
[1 2 3] int32