Machine Learning/numpy & pandas & maplotlib

[NumPy#1] 넘파이란? dtype, astype(), itemsize, size, shape

코딩상륙작전 2023. 8. 4. 01:39

* 넘파이(NumPy)란?

  • 넘파이(NumPy)는 파이썬의 다차원 배열을 다루기 위한 라이브러리이다.
  • 2005년 Travis  Oliphant이 Numarray을 Numeric에 합쳐 만들었다.
  • 넘파이 배열 데이터 구조를 ndarray라고도 부른다. n-dimensional  array의 준말이다.
  • 넘파이는 C언어로 작성되었고, 넘파이의 속도가 빠른 이유는 연속된 메모리 블럭을 갖기 때문에 CPU가 빠르게 읽을 수 있다. 반면에, Python의 리스트는 랜덤한 메모리 블럭의 객체를 지정하는 포인터 개념이기 때문에 CPU가 빠르게 캐치하지 못해서 속도가 느린 것이다.
  • 넘파이 배열은 고정된 사이즈를 갖고,  homogenous하다. 원소들이 반드시 같은 타입이어야 한다.
  • 파이썬 리스트에서 원소를 추가하거나 삭제하는 과정이 쉬운 반면, 넘파이에서는 새로운 배열을 만들고 모두 옮기기 때문에 매우 expensive하다.
  • 넘파이는 vectorized operations(백터화)와 broadcasting(브로드캐스팅) 때문에 파이썬 못지 않게 우아하고 가독성 있을 수 있다.
  • 넘파이 배열은 최대 32차원까지 가질 수 있다.

* dtype: (attribute) 배열의 타입 출력.

기본적으로 넘파이는 파이썬에서 넘겨 받은 인자들로 배열을 구성하기 때문에 타입을 알아서 추론한다.

배열의 타입 확인은 dtype attribute를 이용한다.(속성은 멤버변수이므로 호출시 괄호가 없다.)

 >>> ary1d.dtype
 dtype('int64')

다른 타입으로 배열을 만들고 싶으면, 인자를 넘길 때 dtype parameter로 타입을 지정해주면 된다.

넘파이에 있는 타입 종류가 궁금하면 여기서 확인할 수 있다.

 

* astype() : (method) 타입 변경 함수.

이미 만들어진 배열을 다운 캐스트나 리캐스트하고 싶으면 astype method를 사용한다. 

>>> float32_ary = ary1d.astype(np.float32)	# 괄호에 변경할 타입을 넣는다.
>>> float32_ary
array([[1., 2., 3.],
       [4., 5., 6.]],    dtype=float32)
       
>>> float32_ary.dtype
dtype('float32')

 

* itemsize : (attribute) 배열 요소 타입의 byte사이즈 출력

int64는 8byte, int32는 4byte를 갖는다.

>>> ary2d = np.array([[1, 2, 3],
                     [4, 5, 6]],    dtype='int64')
>>> ary2d.itemsize
8	# 8byte

 

* size : (attribute) 요소의 개수 출력.

>>> ary2d.size
6

 

* ndim : (attribute) 차원 개수(rank of tensor) 출력.

여기서 차원은 몇 중 리스트인지를 의미. ary2d는 2중 리스트이므로 2차원.

>>> ary2d.ndim
2

 

* shape : (attribute) 각 차원의 개수(axes) 출력.

여기서 차원은 n중 리스트의 각 요소가 몇 개인지 출력. 바깥 리스트부터 세서 튜플로 출력함.

>>> ary=np.array([[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]],[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]]], dtype='int64')
>>> ary.shape
(2, 5, 3)

>>> ary=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]], dtype='int64')
>>> ary.shape
(5, 3)

 

* zero-dimentional array

0차원 배열을 생성.

>>> scalar=np.array(5)

 

0차원 배열의 ndim

>>> scalar.ndim
0

 

0차원 배열의 shape

>>> scalar.shape
()

 

 

* 참고 : 

https://numpy.org/doc/stable/reference/arrays.ndarray.html

https://sebastianraschka.com/pdf/books/dlb/appendix_f_numpy-intro.pdf