본문 바로가기
딥러닝

딥러닝 넘파이(Numpy) 설치, 기초 연산 및 설명

by Go! Jake 2021. 5. 5.

 

 

  해당 포스팅은 '밑바닥부터 시작하는 딥러닝'과 기타 인터넷 자료를 요약한 자료입니다.

넘파이 (Numpy) 

딥러닝을 구현하다 보면 배열이나 행렬 계산이 많이 등장한다. 넘파이는 데이터를 표현하기 위한 주요 데이터 구조로 사용된다. 넘파이의 배열 클래스인 numpy.array에는 편리한 메서드가 많이 준비되어 있어, 이를 이용하기 위한 기초를 배운다.

 

1. 넘파이 (Numpy) 설치

windows - cmd.exe를 실행한 후 아래와 같이 pip install numpy를 입력하여 넘파이를 설치한다.* 설치 오류 등에 대한 문의는 따로 받지 않습니다.

1.1. 넘파이 가져오기

import numpy as np

넘파이는 외부 라이브러리이므로 파이썬에서 import numpy as np로 불러온다. 이 때 as np를 통해 np로 줄여 사용하는 데, 암묵적인 룰인 것처럼 np로 사용하게 된다.

 

1.2. 넘파이 배열 생성하기

Input/Output

>>> import numpy as np
>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[1. 2. 3.]
>>> type(x)
<class 'numpy.ndarray'>

넘파이 배열을 만들 때는 np.array() 메서드를 사용한다. np.array()는 파이썬의 '리스트'를 인수로 받아 넘파이 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)를 반환한다.

1.3 넘파이의 산술 연산

>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x+y
array([3., 6., 9.])
>>> x-y
array([-1., -2., -3.])
>>> x*y
array([ 2.,  8., 18.])
>>> x/y
array([0.5, 0.5, 0.5])

배열 x와 y의 원소 수가 같다. x와 y의 원소 수가 같다면 산술 연산은 각 원소에 대해서 행해진다. 원소가 다른 경우 오류가 발생한다.

 

1.4 넘파이의 N차원 배열

아래 내용은 .shape / .dtype을 사용하게 된다. .shape은 행렬의 형상을 표출하며, 행렬에 담긴 자료형은 .dtype으로 알 수 있다.

>>> import numpy as np
>>> A=np.array([[1,2],[3,4]])
>>> print(A)
[[1 2]
 [3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype('int32')

 

1.5 브로드캐스트 (broadcast)

브로드캐스트는 NumPy로 다른 형상의 행렬에 대한 연산을 편리하게 다루는 기능이다. 시각적으로 표현하면 아래와 같다.

출처: https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arrays-broadcasting.html

같은 형상의 행렬에 대해서는, 요소 간 연산 (element by element)이 수행된다.

>>> a = np.array([0, 1, 2])
>>> b = np.array([5, 5, 5])
>>> a + b
array([5, 6, 7])

다른 행렬의 연산 중 스칼라 연산(0차원)이 가능하다.

>>> a
array([0, 1, 2])
>>> a + 5
array([5, 6, 7])

 

출처: 밑바닥부터 시작하는 딥러닝

1차원 배열인 B도 2차원 배열인 A와 계산 시에는 같은 형상으로 변형된 후 원소별 연산이 이뤄진다.

>>> A=np.array([[1,2],[3,4]])
>>> B=np.array([10,20])
>>> A*B
array([[10, 40],
       [30, 80]])

 

 

1.6 원소 접근

인덱스로 접근

>>> X=np.array([[51,55],[14,19],[0,4]])
>>> print(X)
[[51 55]
 [14 19]
 [ 0  4]]
>>> X[0]
array([51, 55])
>>> X[0][1]
55

X[0]과 X[0][1]에서 볼 수 있듯 index 설정을 통해 리스트와 같이 접근할 수 있다.

 

For문 접근

>>> for row in X:
...     print(row)
...
[51 55]
[14 19]
[0 4]

 

>>> X=X.flatten()
>>> print(X)
[51 55 14 19  0  4]
>>> X[np.array([0,2,4])]
array([51, 14,  0])

flatten() 함수를 사용하면 1차원 함수로 바꿀 수 있다. 또한 X array에 대해 X[np.array([0,2,4])]와 같이 조건을 지정하여 접근하는 경우 특정 원소만 얻을 수 있다.

 

>>> X>15
array([ True,  True, False,  True, False, False])
>>> X[X>15]
array([51, 55, 19])

X>15로 사용하면 각 array에 대한 True/False 여부가 나오고, X[X>15]로 X array 내에 조건을 추가하는 경우 조건을 만족하는 요소만 찾을 수 있다.

 

댓글