본문 바로가기
파이썬 (Python)/Numpy

Python 파이썬 numpy, matplotlib 모듈로 meshgrid 구현 및 이해해보자!

by ★√★ 2021. 2. 27.

안녕하세요, 오늘 포스팅 할 내용은, numpy, matplotlib 모듈을 이용하여, meshgrid에 대해서 이해하고, 응용해서 구현해 보는 내용입니다. 바둑알 처럼 보이는 효과라고 생각하시면 이해하기 쉬우실 겁니다.

 

meshgrid-meshgrid-썸네일

 

 

 이번에는 matplotlib 모듈을 이용해서 meshgrid를 적용하는 거지만 이에 대해서 공부하기 전에 이전 포스팅에서 기재한 matplotlib를 이용해서 3D Graph를 구현한 내용을 참조해서 보시면 더 이해가 쉬우 실거라고 생각합니다. 지난 포스팅은 아래 링크 참조 부탁 드립니다. 

 

 

1. meshgrid Definition 및 기본 Code 구문

: 일련의 X축과 Y축의 Value 값을 받아서, 좌표 행렬을 Return 값으로 출력하는 Numpy Method 함수로써, 사용되며, 기본 구문은 아래와 같습니다.

 

- np.meshgrid (x 축 Value , y 축 Value, sparse=True or False(기본값))

 

- 쉬운 예를 돕기 위해서 아래 Code를 예제로 들어서 간단하게 설명 해드리도록 하겠습니다. 

 

========================================================================

 

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter


x = np.arange(1,4)   # 1~3의 값을 입력함.
y = np.arange(1,4)   # 1~3의 값을 입력함.

print('x의 출력 값은 : \n',x)   # x의 내부 요소를 출력함.
print('y의 출력 값은 : \n',y)   # y의 내부 요소를 출력함.

xx, yy = np.meshgrid(x,y)       # x, y의 요소를 통해서, meshrid 측, 좌표 행렬을 Return함.

print('xx의 출력 값은 : \n',xx)   # Return 한 xx 좌표 행렬 값을 출력함.
print('yy의 출력 값은 : \n',yy)   # Return 한 yy 좌표 행렬 값을 출력함.

 

========================================================================

 

- 위 코드를 실행 시켜 보면, 아래와 같은 결과 값을 보실 수 있습니다. x, y의 list 요수의 값이 좌표 행렬 값으로 출력이 되는 걸 확인 하실 수 있습니다. x 의 값은, 행으로 중복으로 출력이 되고, y의 값은 열방향으로 중복으로 출력이 되는 걸 확인 하실 수 있습니다.

 

meshgrid-기본-코드구문-사진1
meshgrid-기본-코드구문-사진1

 

- 더 쪼개서 설명을 드리면, 아래와 같습니다. X 축의 위치의 값과 Y축의 위치의 값이 어떻게 구현이 되는지 아래 설명을 보시면 더 이해가 빠르실 거라고 생각됩니다. 

 

meshgrid-기본-코드구문-사진2
meshgrid-기본-코드구문-사진2

 

 

2. meshgrid의 속성 값 sparse=True or False(기본값) 에 따라 구현 방식

 

 1) sparse=True 의 경우 (np.meshgrid(x,y, sparse=True))

  : np.ogrid[] Method와 같은 Function으로 작동하며, 출력하는 값은, 서로 xx, yy 값이 반대로 출력이 된다. 그래서, (xx, yy =  np.ogrid[] 경우) meshgrid에서는 반대로, yy, xx 로 입력 값을 받아야 똑같은 output을 출력한다. 간단한 예제를 통해서 설명해 드리겠습니다. 예제 Code는 아래와 같습니다.

 

==================================================================================

 

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter



yy, xx = np.ogrid[0:10, 0:10]                            # np.ogrid을 구현함. meshgrid와 변수 값을 반대로 Assign 하라고 배치함.

print('xx의 출력 값은 : \n', xx)                          # xx의 좌표행렬 값을 출력
print('yy의 출력 값은 : \n', yy)                          # yy의 좌표행렬 값을 출력

print('xx.ravel()의 출력 값은 : \n', xx.ravel())    # xx의 좌표행렬 값을 List 화 시킴
print('yy.ravel()의 출력 값은 : \n', yy.ravel())    # yy의 좌표행렬 값을 List 화 시킴

==================================================================================

 

- 위 코드를 실행 시켜 보면 아래와 같이 구현이 되는 걸 확인 하실 수 있습니다.

 

meshgrid-기본-코드구문-사진3
meshgrid-기본-코드구문-사진3

 

- 위 코드를 이용하여, graph에 어떻게 구현이 되는지 확인 해보도록 하겠습니다. 이해를 돕기 위해서, 2D Graph로 구현하도록 하겠습니다. 

 

==================================================================================

test_graph1 =plt.figure(1)                                              # test_graph1 라는 흰 도화지를 호출 



# Graph의 "Title을 sparse=True Case (np.meshgrid(x,y, sparse=True))" 이라고 명시함.

plt.title('sparse=True Case (np.meshgrid(x,y, sparse=True))')   



#grid 형태로 Type을 정함.

plt.grid()



# 좌표행렬 값을 List 화 시킨 값으로, x축 y축의 간격을 표현함.
plt.xticks(xx.ravel())   
plt.yticks(yy.ravel())     



# xx, yy의 좌표행렬의 값을 통해서, 각 위치를 나타내는 좌표를 특수문자(*,x) 로 표시함. 색깔은 구별을 위해 다양하게 설정.

# np.ones_like - 단위 행렬 변화 Method를 구현



plt.scatter(xx, np.ones_like(xx), color="blue", marker="*")
plt.scatter(np.ones_like(yy), yy, color="red", marker="x")
plt.scatter(xx, yy, color="purple", marker="*")



# Graph를 보여줌

plt.show()

 

==================================================================================

 

- 위 코드를 실행 시켜 보면, 아래와 같은 결과 값을 보실 수 있습니다. 즉, xx, yy 행렬 값에 단위 행렬과 결합 시키니까, 딱 그 수치대로 나오고, xx, yy 의 결합을 하니까, 선형적으로 증가하는 점의 표현을 보실 수 있습니다.

 

meshgrid-기본-코드구문-사진4
meshgrid-기본-코드구문-사진4

 

2) sparse=False(기본 값) 의 경우 (np.meshgrid(x,y, sparse=False))

  : np.mgrid[] Method와 같은 Function으로 작동하며, mgrid도 출력하는 값은, 서로 xx, yy 값이 반대로 출력이 된다. 그래서, (xx, yy =  np.mgrid[] 경우) meshgrid에서는 반대로, yy, xx 로 입력 값을 받아야 똑같은 output을 출력한다. 간단한 예제를 통해서 설명해 드리겠습니다. 예제 Code는 아래와 같습니다.

 

==========================================================================

 

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter



yy, xx = np.mgrid[0:10, 0:10]              # np.mgrid[x, y]을 구현함.

print('xx의 출력 값은 : \n', xx)                          # xx의 좌표행렬 값을 출력
print('yy의 출력 값은 : \n', yy)                          # yy의 좌표행렬 값을 출력

print('xx.ravel()의 출력 값은 : \n', xx.ravel())    # xx의 좌표행렬 값을 List 화 시킴
print('yy.ravel()의 출력 값은 : \n', yy.ravel())    # yy의 좌표행렬 값을 List 화 시킴

 

==========================================================================

 

 

- 위 코드를 실행 시켜 보면 아래와 같이 구현이 되는 걸 확인 하실 수 있습니다.

 

meshgrid-기본-코드구문-사진5
meshgrid-기본-코드구문-사진5

 

mgrid도 graph에 어떻게 구현이 되는지 확인 해보도록 하겠습니다. 마찬가지로, 이해를 돕기 위해서, 2D Graph로 구현하도록 하겠습니다. 

 

 

==========================================================================

 

test_graph1 =plt.figure(1)                                              # test_graph1 라는 흰 도화지를 호출 



# Graph의 "Title을 sparse=True Case (np.meshgrid(x,y, sparse=True))" 이라고 명시함.

plt.title('sparse=True Case (np.meshgrid(x,y, sparse=False))')   



#grid 형태로 Type을 정함.

plt.grid()



# 좌표행렬 값을 List 화 시킨 값으로, x축 y축의 간격을 표현함.
plt.xticks(xx.ravel())   
plt.yticks(yy.ravel())     



# xx, yy의 좌표행렬의 값을 통해서, 각 위치를 나타내는 좌표를 특수문자(*,x) 로 표시함. 색깔은 구별을 위해 다양하게 설정.

# np.ones_like - 단위 행렬 변화 Method를 구현



plt.scatter(xx, np.ones_like(xx), color="blue", marker="*")
plt.scatter(np.ones_like(yy), yy, color="red", marker="x")
# plt.scatter(xx, yy, color="purple", marker="*") # 이 부분은 비활성 시켜서 1차적으로 구현해 봄.



# Graph를 보여줌

plt.show()

 

==========================================================================

 

Case #1 plt.scatter(xx, yy, color="purple", marker="*") # 이 부분은 비활성 경우

- 비활성 후 구현을 해보면, ogrid와 똑같은 결과를 보실 수 있습니다. 그런데, 이 그림은 단위행렬을 적용해서 한 점으로 보이지만, 여러가지 점이 중첩되어 있는 상황입니다. 아래 Case #2를 보시면 더 이해가 빠르실 겁니다.

 

meshgrid-기본-코드구문-사진6
meshgrid-기본-코드구문-사진6

 

Case #2 plt.scatter(xx, yy, color="purple", marker="*") # 이 부분만 활성화 할 경우

- Case #1에서 설명 드렸듯이, 각 행렬의 값이 서로 서로 맞출리니까, 모든 점이 표현이 되는 것입니다. Case #1은 여러개의 점이 한 곳에 모여 있었던 것입니다. 

 

==========================================================================

# plt.scatter(xx,np.ones_like(xx),color="blue",marker="*")
# plt.scatter(np.ones_like(yy),yy,color="red",marker="x")
plt.scatter(xx, yy, color="purple", marker="*") # 이 부분만 활성화 함.

==========================================================================

 

meshgrid-기본-코드구문-사진7
meshgrid-기본-코드구문-사진7

 

 

이상입니다. 지금까지 numpy, matplotlib 모듈을 이용하여, meshgrid를 어떻게 사용하고 이 부분에 대해서 더 자세하게 이해할 수 있는 내용으로 포스팅을 작성하였습니다.

 

몇 개 포스팅을 하면서 numpy, matplotlib 모듈을 이제 좀 이해했다고 생각했는데, meshgrid 하나도 이렇게 이해해야 하는 포인트가 너무 많은 거 같습니다. 정말 공부는 끊이 없고, 하나 파고 들어가면, 하나 하나 중요하지 않은 게 없는 거 같습니다. 그냥 그런 갑다 하고, 넘어가다가, 정말 코너에 몰리면.. 멘붕 올 거 같아서, 이렇게 자세히 공부 안하면 불안한 저인 거 같습니다. 여러분은 어떠신지요?! 그냥 꾸준히 열심히 하면 그 고지에 가지 않을까 라는 생각을 합니다. 항상 같이 공부하고, 같이 성장하시죠! 감사합니다. 

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글