[Numpy]격자 그리드 만들기(meshgrid)

반응형
    반응형

    넘파이의 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] - ndarray 생성하기

     

    댓글

    Designed by JB FACTORY

    ....