[Numpy]격자 그리드 만들기(meshgrid)
- Python/Numpy
- 2021. 5. 19.
넘파이의 meshgrid() 함수를 이용해 직사각형의 그리드를 만들어보겠습니다.
먼저 직사각형 그리드는 말 그대로 격자를 의미합니다.
$ P_{ij}= (x_{i},y_{j}) $ 라고 하면 그림과 같이 하나의 좌표로써 표현 할 수 있는데
그림과 같이 직사각형 그리드 안에서 될 수 있도록 배치를 하는게 meshgrid의 역할입니다.
meshgrid()를 이용해서 교정(?)을 해놓으면 3차원 그림을 그릴 때 유용합니다.
매개변수(Parameter)
meshgrid()의 파라미터를 살펴보면 다음과 같습니다.
np.meshgrid(xi, copy=True, sparse=False, indexing='xy')
- xi : 그리드에 나타낼 1차원 배열 벡터
- copy : 디폴트는 True, False가 되면 메모리 절약을 위해 오리지널 배열로 반환
- sparse : 디폴트는 False, True로 하면 메모리 절약을 위해 희소 그리드를 반환
- indexing : {'xy','ij}, 카테시안 인덱스(일반좌표) 표시를 원하면 'xy', 행렬 인덱스는 'ij'
예제
meshgrid를 사용해보겠습니다.
import numpy as np
x = np.linspace(1,10,10)
y = np.linspace(11,20,10)
x는 1에서 10까지 y는 11에서 20까지의 1차원 배열입니다.
X,Y = np.meshgrid(x,y)
X,Y 로 x,y를 정의하면 다음과 같이 나옵니다.
X
Y
직사각형으로 만들어야 하니 보시는 것처럼 X,Y 모양이 10x10이 되게 됩니다.
점의 위치를 scatter로 보면 meshgrid가 무엇을 하는지 알 수 있습니다.
맨 위의 그림처럼 나오게 됩니다.
import matplotlib.pyplot as plt
plt.scatter(X,Y)
plt.grid()
각각의 좌표가 X,Y로 이루어져서 점이 가지런히 정렬이 된 걸 볼 수 있습니다.
이제 매개변수가 어떤 역할을 하는지 보겠습니다.
indexing
indexing 부터 보겠습니다.
카테시안과 행렬의 인덱스 방식의 차이가 있는데
카테시안은 x는 가로, y는 세로로 보고 행렬은 i가 세로, j는 가로로 봅니다.
그래서 서로 traspose가 된 모양으로 나오게 됩니다.
실제로 해봐도 그렇게 됩니다.
x1,y1 = np.meshgrid(x,y)
x2,y2 = np.meshigrid(x,y,indexing='ij')
print(x1[0][1], x2[0][1])
같은 좌표를 넣고 print를 해보면 다른 값이 나옵니다.
transpose로 좌표를 잡으면 같은 값이 나오게 됩니다.
print(x1[0][1],x2[1][0])
sparse
메모리를 아끼는 작업입니다. 희소 그리드(sparse grid)라고 합니다
출력을 하면 바로 알 수 있습니다.
x2,y2 = np.meshgrid(x,y,sparse=True)
x2
10x10이기 때문에 출력을 하면 10x10 모양이 다 나왔는데 한개만 나오고 끝이 납니다.
실제로 모양도 (1,10)이 됩니다.
x2.shape
y2 면 (10,1)이 나오게 됩니다.
y2
copy는 눈으로 확인이 불가능해서 보여드릴수가 없네요 ㅜ
보통 뭔가를 만들어서 출력을 하면 컴퓨터가 메모리에 임시적으로 저장을 하게 되는데 copy = False 이면 임시 저장하지 않고 원본을 쓰겠다 이정도로 받아들이시면 될 것 같습니다. 정말 너무 데이터가 많고 내 메모리가 도저히 감당할 수 없는 상황까지 가는 경우는 극히 드물기 때문에 잘 안 쓰지 않을까 싶습니다.
관련 포스팅
[Python/matplotlib] - [matplotlib] 산포 그래프(scatter)
'Python > Numpy' 카테고리의 다른 글
[Numpy] 소수점 반올림하기(np.set_printoptions) (0) | 2021.09.28 |
---|---|
[Numpy]ndarray 저장, 불러오기 (0) | 2021.06.15 |
[Numpy] 구조체(structured array) (0) | 2021.05.01 |
[Numpy] 조건문 걸어서 값 넣기(np.where) (0) | 2021.04.30 |
[Numpy]행렬곱(@)과 내적(dot) 그리고 별연산(*) (0) | 2021.04.07 |