안녕하세요, 오늘 포스팅 할 내용은, numpy, matplotlib 모듈을 이용하여, 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의 값은 열방향으로 중복으로 출력이 되는 걸 확인 하실 수 있습니다.
- 더 쪼개서 설명을 드리면, 아래와 같습니다. X 축의 위치의 값과 Y축의 위치의 값이 어떻게 구현이 되는지 아래 설명을 보시면 더 이해가 빠르실 거라고 생각됩니다.
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 화 시킴
==================================================================================
- 위 코드를 실행 시켜 보면 아래와 같이 구현이 되는 걸 확인 하실 수 있습니다.
- 위 코드를 이용하여, 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 의 결합을 하니까, 선형적으로 증가하는 점의 표현을 보실 수 있습니다.
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 화 시킴
==========================================================================
- 위 코드를 실행 시켜 보면 아래와 같이 구현이 되는 걸 확인 하실 수 있습니다.
- 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를 보시면 더 이해가 빠르실 겁니다.
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="*") # 이 부분만 활성화 함.
==========================================================================
이상입니다. 지금까지 numpy, matplotlib 모듈을 이용하여, meshgrid를 어떻게 사용하고 이 부분에 대해서 더 자세하게 이해할 수 있는 내용으로 포스팅을 작성하였습니다.
몇 개 포스팅을 하면서 numpy, matplotlib 모듈을 이제 좀 이해했다고 생각했는데, meshgrid 하나도 이렇게 이해해야 하는 포인트가 너무 많은 거 같습니다. 정말 공부는 끊이 없고, 하나 파고 들어가면, 하나 하나 중요하지 않은 게 없는 거 같습니다. 그냥 그런 갑다 하고, 넘어가다가, 정말 코너에 몰리면.. 멘붕 올 거 같아서, 이렇게 자세히 공부 안하면 불안한 저인 거 같습니다. 여러분은 어떠신지요?! 그냥 꾸준히 열심히 하면 그 고지에 가지 않을까 라는 생각을 합니다. 항상 같이 공부하고, 같이 성장하시죠! 감사합니다.
제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다.
[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]
'파이썬 (Python) > Numpy' 카테고리의 다른 글
Python 파이썬 numpy, matplotlib 모듈로 3D 그래프를 그려보자 (1) | 2021.02.26 |
---|---|
Python 파이썬 numpy, matplotlib 모듈로 그래프를 손쉽게 그려보자 (1) | 2021.02.26 |
Python 파이썬 numpy 함수 any, all, where, 행렬 인덱싱(index)과 슬라이싱 (1) | 2021.02.25 |
Python 파이썬 numpy 함수 행렬간 사칙 연산 (add, substract, multiply, divide) 누적 합계, 평균, 최대값, 조건값의 인덱스 출력 (1) | 2021.02.25 |
Python 파이썬 numpy 함수 Boolean indexing 리스트, 조건 값에 맞춰서 리스트 화 (0) | 2021.02.22 |
댓글