NumPy와 Matplotlib 살펴보기

HAYUN_KIM·2024년 1월 29일
post-thumbnail

1. NumPy 기초

NumPy는 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리이다.

넘파이는 데이터 구조 외에도 수치 계산을 위해 효율적으로 구현된 기능을 제공한다. 넘파이의 배열 클래스인 numpy.array에는 배열 및 행렬 계산에 편리한 메서드가 많아 파이썬으로 딥러닝을 구현할 때 많이 사용된다.

1.1 NumPy 배열 생성

# 넘파이 사용을 위한 import
>>> import numpy as np 

넘파이는 표준 파이썬 라이브러리에 포함되지 않는 외부 라이브러리이기 때문에
사용을 위해서는 import 구문을 통해 가져오는 작업이 필요하다.
위의 import 구문을 통해 np라는 이름으로 넘파이를 가져와 사용할 수 있다.

# 넘파이 배열 생성
>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[1. 2. 3.]

# 생성된 넘파이 배열의 자료형 확인
>>> type(x)		
<class 'numpy.ndarray'>

np.array() 메서드를 통해 넘파이 배열을 생성할 수 있다.
np.arrat()는 파이썬의 리스트를 인수로 받아 넘파이가 제공하는 배열인 numpy.ndarray를 반환한다.

1.2 Numpy 배열의 산술 연산

>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2,0, 4.0, 6.0])

>>> x + y	# 원소별(element-wise) 덧셈
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=np.array([1.0, 2.0, 3.0])
>>> y=np.array([2,0, 4.0, 6.0])
>>> x+y
ValueError: operands could not be broadcast together with shapes (3,) (4,) 

위와 같이 연산되는 배열의 원소 수가 다르면,
"피연산자가 브로드캐스트(1.4에서 설명)될 수 없다." 라는 메세지와 함께 에러가 발생한다.

1.3 NumPy의 N차원 배열

넘파이는 1차원 배열(벡터) 뿐만 아니라 다차원 배열도 지원한다.
예를 들어 2차원 배열(행렬)의 생성 방법은 아래와 같다.

>>> A = np.array([[1,2],[3,4]])
>>> print(A)
[[1 2]
 [3 4]]
>>> A.shape 	# 행렬 A의 형상(각 차원의 원소 개수, 차원 별 크기)
(2, 2)
>>> A.dtype		# 행렬 A의 자료형
dtype('int32')

1차원 배열을 생성할 때와 마찬가지로, 배열을 인수로 받아 생성한다.
위의 예제는 np.array()함수에 2차원 배열을 인수로 넘겨 2x2의 형상을 갖는 2차원 넘파이 배열을 생성했다.
shape함수를 통해 행렬의 형상을, dtype 함수를 통해 행렬의 자료형을 얻을 수 있다.

>>> B = np.array([[3,0], [0,6]])
>>> A + B
array([[ 4,  2],
       [ 3, 10]])
>>> A * B
array([[ 3,  0],
       [ 0, 24]])

1차원 배열과 마찬가지로, 2차원 배열 또한 형상이 같은 배열끼리라면 대응되는 원소 별로 산술연산이 수행된다.

1.4 브로드캐스트

NumPy에서 형상이 다른 배열끼리의 연산을 지원하는 기능

앞서 연산되는 배열의 형상이 다를 경우, "브로드캐스트할 수 없다." 라는 메시지를 볼 수 있었다. (1.2 참고)
넘파이에서는 연산되는 배열의 차원이나 크기가 달라도, 특정 조건을 충족하면 자동으로 확장하여 연산하는 기능이 있는데, 이를 브로드캐스트라 부른다.

아래는 두 배열의 연산 과정에서 발생하는 브로드캐스트의 예이다.
두 배열의 합에서 나타난 브로드캐스트

# 브로드캐스트 예시
>>> A = np.array([[1,2], [3,4]])
>>> B = np.array([1,2])
>>> A + B
array([[2, 4],
       [4, 6]])

위의 경우에서 두번째 배열이 [[1,2], [1,2]] 의 형태로 확장된 후 연산되었음을 알 수 있다.

브로드캐스트가 발생하는 조건은 간단히 말해 각 차원에서 배열의 크기가 같거나 한 배열의 크기가 1이어야 한다는 것이다. 브로드캐스팅이 가능한지 여부를 결정하기 위해 NumPy는 각 차원에서 크기를 비교하며 호환성을 확인하고, 작은 차원의 배열은 더 큰 차원의 배열과 호환될 수 있도록 축소 또는 확장된다.

브로드캐스트 발생 조건에 비추어봤을 때 1.2에서 브로드캐스트에 실패한 이유는 두 배열 모두 1차원 배열이면서 둘 중 한 배열의 크기가 1이 아니고, 서로 다른 크기를 갖기 때문인 것으로 알 수 있다.

2. Matplotlib 사용해보기

Matplotlib는 Python 프로그래밍 언어 및 수학적 확장 NumPy 라이브러리를 활용한 플로팅 라이브러리이다.

matplotlib는 그래프와 데이터 시각화에 최적화된 라이브러리로, 딥러닝 실험에서 그래프를 그리고 이미지를 화면 상에 표시하는 데 많이 쓰인다.

2.1 간단한 그래프 그리기

아래는 Matplotlib의 pyplot 모듈을 사용하여 sin 함수와 cos 함수를 그려보는 간단한 예제이다.

import numpy as np
import matplotlib.pyplot as plt

# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1 간격으로 생성
y1 = np.sin(x)
y2 = np.cos(x)

# 그래프 그리기
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle="--", label="cos") # cos 함수는 점선으로 그리기
plt.xlabel("x")     # x축 이름
plt.ylabel("y")     # y축 이름
plt.title("sin & cos")  # 제목
plt.legend()
plt.show()

그래프에 사용될 데이터 생성을 위해 넘파이의 arange() 메서드를 통해 x축 데이터를 생성하고, 넘파이에서 지원하는 sin, cos 함수를 통해 y축 데이터를 생성하였다.

생성된 리스트 형태의 데이터들은 plot() 메서드를 통해 그래프로 그려지고 show() 메서드를 통해 화면에 출력된다.


이 외에도 pyplot에서 지원하는 메서드들을 통해 축의 이름, 선의 형태, 제목 등을 지정해줄 수 있다.

2.2 이미지를 불러와 표시하기

matplotlib은 이미지를 표시를 위한 메서드도 지원하고 있다.

import matplotlib.pyplot as plt
from matplotlib.image import imread

# 이미지 불러와 표시하기
img = imread('./goo-reum.png') # 이미지 읽어오기(적절한 경로 설정 필요)
plt.imshow(img)
plt.show()

image 모듈을 통해 imread() 메서드를 호출하여 이미지를 읽고 pyplot의 imshow()를 통해 화면에 출력하였다.
imread() 메서드는 불러올 이미지 파일의 경로를 문자열 인수로 넘겨받아 해당 경로의 이미지를 읽어온다.
읽어온 이미지 데이터는 imshow() 메서드를 통해 화면에 아래와 같이 표시된다.


출처 : 밑바닥부터 시작하는 딥러닝 - 파이썬으로 익히는 딥러닝 이론과 구현

0개의 댓글