파이썬 넘파이(Numpy) 사용법 총정리 : 설치부터 배열 생성 및 정보 확인 방법

파이썬으로 데이터 분석이나 머신러닝 공부를 하게 되면 반드시 만나게 되는 라이브러리가 있습니다. 바로 넘파이(Numpy)입니다. 넘파이는 대규모 수치 데이터를 빠르고 효율적으로 처리할 수 있게 해주는 파이썬의 핵심 도구 중 하나입니다. 

이 글에서는 넘파이의 개념과 설치 방법부터 배열 생성, 그리고 배열 정보 확인 방법까지 기본적인 넘파이 사용법을 정리해드리도록 하겠습니다. 


01. 넘파이(Numpy)란?

넘파이(Numpy)는 Numerical Python의 약자로 다차원 배열의 연산 처리를 효율적으로 처리할 수 있어 선형대수, 통계 데이터 등에서 자주 사용되는 라이브러리입니다. 


1) 넘파이(Numpy) 설치 및 사용법

아나콘다를 사용하시는 분은 아나콘다 설치시 기본적으로 numpy가 설치되어 있으므로, 바로 import 하여 사용하시면 되고, 파이썬만 설치하신 분들은 아래와 같이 pip로 설치 후 사용하시면 됩니다. 
  • 설치 : pip install numpy (아나콘다에는 기본적으로 설치 되어 있음)
  • 사용 : import numpy as np (관례적으로 별칭은 np를 사용함)

2) 넘파이 배열 vs 파이썬 리스트 (Numpy Array vs Python List)

  • 넘파이 배열 : 각 데이터 값을 연속된 메모리에 저장하여 사용 (모든 데이터가 같은 자료형이어야 하며, 개수 변경 불가)
  • 파이썬 리스트 : 각 데이터의 주소값을 저장하여 사용 (데이터에 접근할 경우 주소값을 가지고 메모리에서 검색하여 사용)
따라서 넘파이의 배열은 파이썬의 리스트에 비해 처리 속도가 빠릅니다. 대량의 데이터를 다룰 때 넘파이는 파이썬의 리스트보다 수십 배 이상의 성능 차이를 보이기도 합니다. 

3) N차원 배열(Ndarray)과 용어

Ndarray(N-Dimensional Array)는 N차원의 배열로 아래 그림과 같은 데이터 구조를 가지고 있습니다. 그리고 배열을 표현할 때 사용되는 용어는 다음과 같습니다. 
  • Axis : 배열의 각 축 
  • Rank : 축의 개수 (차원의 수)
  • Shape : 각 축의 길이 (ex, (2, 3))
  • Size : 크기 (ex, 2x3=6)
  • Scalar : 숫자
  1. Vector : 1차원 배열 (Scala의 배열) 
  2. Matrix : 2차원 배열 (Vector의 배열)
  3. Tensor : 3차원 이상의 배열 (Matrix의 배열)
넘파이 n차원 배열 구조
넘파이 - N차원 배열 구조

02. Numpy 배열 사용법

1) 배열 생성방법

배열(ndarray 클래스 객체)은 Numpy의 array() 함수를 사용하여 만들 수 있습니다. 이때 배열의 데이터 값은 주로 리스트를 사용하여 전달합니다. 

  • arr = np.array( [1, 2, 3] )
import numpy as np

data = [1, 2, 3]       # list
arr = np.array(data)   # array
print(data, arr)       # [1, 2, 3] [1 2 3]

배열은 한 가지 타입의 데이터만 사용 가능하기 때문에 서로 다른 데이터가 섞여 있으면 더 포괄적인 타입으로 자동 형변환됩니다. dtype 속성을 사용하면 자료형을 직접 지정할 수도 있습니다.

  • int, float str : 파이썬 기본 타입
  • np.int16, np.float16, np.str_ : Numpy 전용 타입으로 np.int64 등으로 메모리 크기 조정 가능

import numpy as np
                                             # [실행결과] print(a1, a1.dtype)
a1  = np.array([1, 2, 3])                    # a1 : [1 2 3]                int64
a2  = np.array([1.0, 2, 3])                  # a2 : [1. 2. 3.]             float64
a3  = np.array(['1.0', 2, 3])                # a3 : ['1.0' '2' '3']        <U21
a4  = np.array([1+2j, 2, 3])                 # a4 : [1.+2.j 2.+0.j 3.+0.j] complex128

a7  = np.array([1, 2, 3], dtype=np.int16)    # a7 : [1 2 3]                int16
a8  = np.array([1, 2, 3], dtype=np.float16)  # a8 : [1. 2. 3.]             float16
a9  = np.array([1, 2, 3], dtype=np.str_)     # a9 : ['1' '2' '3']          <U1
a10 = np.array([1, 2, 3], dtype=int)         # a10: [1 2 3]                int64
a11 = np.array([1, 2, 3], dtype=float)       # a11: [1. 2. 3.]             float64
a12 = np.array([1, 2, 3], dtype=str)         # a12: ['1' '2' '3']          <U1 


2) 배열 정보 확인방법

배열의 자료형 및 크기 등 정보를 확인하려고 할 때는 아래의 속성을 사용하여 확인 할 수 있습니다.

  1. .dtype : 데이터 자료형 확인 (int64, float 64 등)
  2. .ndim : 차원의 수 확인 (1차원, 2차원 )
  3. .shape : 배열의 구조 확인 (행, 열)
  4. .size : 배열의 전체 요소의 개수 확인
  • type( ) : 자료형(타입)을 확인하는 파이썬 내장함수

import numpy as np

data_list  = [1, 2, 3]
data_tuple = (1, 2, 3)
data_set   = {1, 2, 3}
data_dict  = {'a':1, 'b':2, 'c':3 }

a1 = np.array(data_list)
a2 = np.array(data_tuple)
a3 = np.array(data_set)
a4 = np.array(data_dict)

print("a1 : ", a1.ndim, a1.shape, a1.size, a1, type(a1), a1.dtype, type(data_list))
print("a2 : ", a2.ndim, a2.shape, a2.size, a2, type(a2), a2.dtype, type(data_tuple))
print("a3 : ", a3.ndim, a3.shape, a3.size, a3, type(a3), a3.dtype, type(data_set))
print("a4 : ", a4.ndim, a4.shape, a4.size, a4, type(a4), a4.dtype, type(data_dict))

[실행결과]

a1 :  1 (3,) 3 [1 2 3]                  <class 'numpy.ndarray'> int64  <class 'list'>
a2 :  1 (3,) 3 [1 2 3]                  <class 'numpy.ndarray'> int64  <class 'tuple'>
a3 :  0 ()   1 {1, 2, 3}                <class 'numpy.ndarray'> object <class 'set'>
a4 :  0 ()   1 {'a': 1, 'b': 2, 'c': 3} <class 'numpy.ndarray'> object <class 'dict'>

3) n차원 배열

n차원 배열의 생성 및 정보 확인 방법입니다.


import numpy as np

a1 = np.array([1,2,3])
a2 = np.array([[1,2,3], [4,5,6]])
a3 = np.array([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])

print("a1:", a1, a1.dtype, a1.ndim, a1.shape, a1.size)
print("a2:", a2, a2.dtype, a2.ndim, a2.shape, a2.size)
print("a3:", a3, a3.dtype, a3.ndim, a3.shape, a3.size)  

[실행결과]

a1:   [ 1  2  3]   int64 1 (3,) 3

a2:  [[ 1  2  3]
      [ 4  5  6]]  int64 2 (2, 3) 6
      
a3: [[[ 1  2  3]
      [ 4  5  6]]

     [[ 7  8  9]
      [10 11 12]]] int64 3 (2, 2, 3) 12  

Previous Post
No Comment
Add Comment
comment url