Python / NumPy에서 meshgrid의 목적은 무엇입니까?


302

누군가 meshgridNumpy에서 기능 의 목적이 무엇인지 설명해 줄 수 있습니까 ? 나는 그것이 플로팅을 위해 일종의 좌표 그리드를 생성한다는 것을 알고 있지만, 그것의 직접적인 이점을 실제로 볼 수는 없습니다.

저는 Sebastian Raschka에서 "Python Machine Learning"을 공부하고 있으며 의사 결정 경계를 그리는 데 사용하고 있습니다. 여기에 입력 11을 참조 하십시오 .

나는 또한 공식 문서 에서이 코드를 시도했지만 다시 출력이 이해가되지 않습니다.

x = np.arange(-5, 5, 1)
y = np.arange(-5, 5, 1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,y,z)

가능하다면 실제 사례도 많이 보여주세요.

답변:


388

meshgridx 값의 배열과 y 값의 배열로 직사각형 격자를 만드는 것이 목적입니다 .

예를 들어, x와 y 방향에서 0과 4 사이의 각 정수 값에 점이있는 그리드를 만들려면 사각형 격자를 만들려면, 우리는 모든 조합이 필요 x하고 y포인트를.

이것은 25 점입니다. 따라서 이러한 모든 점에 대해 x 및 y 배열을 만들려면 다음을 수행 할 있습니다.

x[0,0] = 0    y[0,0] = 0
x[0,1] = 1    y[0,1] = 0
x[0,2] = 2    y[0,2] = 0
x[0,3] = 3    y[0,3] = 0
x[0,4] = 4    y[0,4] = 0
x[1,0] = 0    y[1,0] = 1
x[1,1] = 1    y[1,1] = 1
...
x[4,3] = 3    y[4,3] = 4
x[4,4] = 4    y[4,4] = 4

결과적으로 다음 xy행렬이 생겨 각 행렬의 해당 요소가 쌍을 이루어 그리드에있는 점의 x 및 y 좌표가 제공됩니다.

x =   0 1 2 3 4        y =   0 0 0 0 0
      0 1 2 3 4              1 1 1 1 1
      0 1 2 3 4              2 2 2 2 2
      0 1 2 3 4              3 3 3 3 3
      0 1 2 3 4              4 4 4 4 4

그런 다음 그리드인지 확인하기 위해 플롯 할 수 있습니다.

plt.plot(x,y, marker='.', color='k', linestyle='none')

여기에 이미지 설명을 입력하십시오

분명히 이것은 특히 넓은 범위의 x및에 대해 매우 지루 y합니다. 대신, meshgrid실제로 우리를 위해이를 생성 할 수 있습니다 : 우리가 지정하는 모든는 고유 x하고 y값을.

xvalues = np.array([0, 1, 2, 3, 4]);
yvalues = np.array([0, 1, 2, 3, 4]);

이제을 호출 meshgrid하면 이전 출력이 자동으로 나타납니다.

xx, yy = np.meshgrid(xvalues, yvalues)

plt.plot(xx, yy, marker='.', color='k', linestyle='none')

여기에 이미지 설명을 입력하십시오

이 직사각형 그리드를 생성하면 많은 작업에 유용합니다. 게시물에 제공 한 예에서는 및에 sin(x**2 + y**2) / (x**2 + y**2)대한 값 범위 에서 함수 ( ) 를 샘플링하는 방법 입니다.xy

이 함수는 사각형 격자에서 샘플링되었으므로 이제 함수를 "이미지"로 시각화 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

또한, 결과는 이제 직사각형 그리드에 데이터를 기대하는 기능 (예에 전달 될 수 있습니다 contourf)


10
반환 값 xx과에 대해서는 설명하지 않았습니다 yy. 나를 위해 신비한 부분은 왜 그 결과 쌍과 결과가 반환되는지였습니다. Hai Phan의 대답은 그 점에서 편리합니다. 플롯은 두 가지 매개 변수를 원하기 때문에 편의상 그렇게한다고 생각합니다.
nealmcb

2
모르겠다-그것이 내가이 정보를 찾는 이유이다;) 그래서 나는 그것이 다른 것을 돌려줘야한다는 것을 말하는 것이 아니다. 나는 단지 받아 들인 대답을 읽는 사람들을 위해 누락 된 정보 조각에 대한 최선의 추측을 제공하고 있습니다. 그리고 당신이 좋아한다면, 나는 여전히 답답한 우리의 사람들을 위해 반환 값 (하이가했던 것처럼)을 설명하면 당신의 대답 (이미 매우 훌륭합니다-감사합니다!)이 조금 더 완성 될 것을 제안합니다.
nealmcb

1
xx와 yy의 값을 더 잘 이해하려면 다음 코드가 np.meshgrid와 동일한 결과를 얻는다는 주장을 고려하십시오.xx = [xvalues for y in yvalues] yy = [[y for x in xvalues] for y in yvalues]
Matt Kleinsmith

1
이 답변 confusing-은 당신의 첫 번째 그림가 없습니다 xy이전 버전? 당신이 할 때 xx, yy = np.meshgrid(np.arange(4), np.arange(4)), 당신이 무엇을의 역순 xy대답의 첫 부분이다. 의 출력 순서와 일치 mgrid하지만 meshgrid 는 일치 하지 않습니다. 은 xxx 방향으로 증가되어야하지만, Y 방향으로 네 증가.
Scott Staniewicz

1
@ScottStaniewicz 우리를 지적 해 주셔서 감사합니다.
Suever

249

Microsoft Excel 제공 : 

여기에 이미지 설명을 입력하십시오


6
좋은. FWIW, 당신은 중간에 쌍의 2 × 12 배열을 원하는 경우 :XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
데니스

5
그리고 중간에 12 x 2 쌍의 배열을 원한다면 :XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
barlaensdoonn

2
좋은 대답입니다. meshgrid의 목적은 각 희미한 좌표를 사용하여 격자를 만드는 것입니다.
좋은 소년

1
조금 이상한 점은 x와 y 값이 이미 하나의 배열로 결합되지 않고 별도로 반환된다는 것입니다. 하나의 배열로 원하는 경우 다음을 수행해야합니다.np.vstack([XX.ravel(), YY.ravel()]).T
user3629892

64

실제로 그 목적은 np.meshgrid문서에 이미 언급되어 있습니다.

np.meshgrid

좌표 벡터에서 좌표 행렬을 반환합니다.

1 차원 좌표 배열 x1, x2, ..., xn이 주어지면 ND 그리드에서 ND 스칼라 / 벡터 필드의 벡터화 된 평가를 위해 ND 좌표 배열을 만듭니다.

따라서 기본 목적은 좌표 행렬을 만드는 것입니다.

당신은 아마 자신에게 물었다 :

좌표 행렬을 만들어야하는 이유는 무엇입니까?

Python / NumPy를 사용하여 좌표 행렬이 필요한 이유는 좌표가 0으로 시작하고 순수한 양의 정수인 경우를 제외하고는 좌표에서 값으로의 직접적인 관계가 없기 때문입니다. 그런 다음 배열의 인덱스를 인덱스로 사용할 수 있습니다. 그러나 그렇지 않은 경우 데이터와 함께 좌표를 저장해야합니다. 그것이 그리드가 들어오는 곳입니다.

데이터가 다음과 같다고 가정하십시오.

1  2  1
2  5  2
1  2  1

그러나 각 값은 가로 2km, 세로 3km를 나타냅니다. 원점이 왼쪽 상단이고 사용 가능한 거리를 나타내는 배열을 원한다고 가정하십시오.

import numpy as np
h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)

여기서 v는

array([[0, 0, 0],
       [2, 2, 2],
       [4, 4, 4]])

그리고 h :

array([[0, 3, 6],
       [0, 3, 6],
       [0, 3, 6]])

두 개의 인덱스가있는 경우 자, 가정 해 봅시다 xy(의 반환 값이 왜의 것을 meshgrid일반적으로 xx또는 xs대신 x내가 선택한이 경우 h다음의 x는 점의 좌표를 얻을 수있는 수평 위해이!)는 y는 점과 좌표 다음을 사용하여 해당 시점의 가치 :

h[x, y]    # horizontal coordinate
v[x, y]    # vertical coordinate
data[x, y]  # value

즉, 훨씬 쉽게 좌표를 추적 유지할 수 당신이 필요 좌표를 알고 있다는 기능에 전달할 수 있습니다 (더 중요한).

조금 더 긴 설명

그러나 np.meshgrid자체가 종종 직접 사용되지 않으며, 대부분의 사람은 단지 중 하나를 사용 유사한 물체 np.mgrid또는 np.ogrid. 여기 np.mgrid대표 sparse=False와 경우 (필자는 참조 의 인수 ). 주 사이에 상당한 차이가 있음 과 과 : 처음 두 리턴 값 (이 둘 또는 이상의 경우) 반전된다. 이것은 중요하지 않지만 상황에 따라 의미있는 변수 이름을 제공해야합니다.np.ogridsparse=Truesparsenp.meshgridnp.meshgridnp.ogridnp.mgrid

예를 들어, 2 차원 격자의 경우와 matplotlib.pyplot.imshow는 첫 번째 반환 항목의 이름을 의미가 np.meshgrid x두 번째 하나를 y그것을위한 다른 방법으로 주위 동안 np.mgrid하고 np.ogrid.

np.ogrid 희소 그리드

>>> import numpy as np
>>> yy, xx = np.ogrid[-5:6, -5:6]
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5],
       [-4],
       [-3],
       [-2],
       [-1],
       [ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5]])

이미에 비해 출력이 반전 말했듯이 np.meshgrid나는 등을 풀었 그 이유는, yy, xx대신 xx, yy:

>>> xx, yy = np.meshgrid(np.arange(-5, 6), np.arange(-5, 6), sparse=True)
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5],
       [-4],
       [-3],
       [-2],
       [-1],
       [ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5]])

이것은 이미 좌표, 특히 2D 플롯의 x 및 y 선처럼 보입니다.

시각화 :

yy, xx = np.ogrid[-5:6, -5:6]
plt.figure()
plt.title('ogrid (sparse meshgrid)')
plt.grid()
plt.xticks(xx.ravel())
plt.yticks(yy.ravel())
plt.scatter(xx, np.zeros_like(xx), color="blue", marker="*")
plt.scatter(np.zeros_like(yy), yy, color="red", marker="x")

여기에 이미지 설명을 입력하십시오

np.mgrid 고밀도 그리드

>>> yy, xx = np.mgrid[-5:6, -5:6]
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5],
       [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4],
       [-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3],
       [-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
       [ 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2],
       [ 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3],
       [ 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4],
       [ 5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5]])

여기에도 동일하게 적용됩니다 np.meshgrid.

>>> xx, yy = np.meshgrid(np.arange(-5, 6), np.arange(-5, 6))
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5],
       [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4],
       [-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3],
       [-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
       [ 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2],
       [ 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3],
       [ 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4],
       [ 5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5]])

달리 ogrid이 어레이에 포함 모두 xxyy좌표 -5 <= XX <= 5; -5 <= yy <= 5 그리드.

yy, xx = np.mgrid[-5:6, -5:6]
plt.figure()
plt.title('mgrid (dense meshgrid)')
plt.grid()
plt.xticks(xx[0])
plt.yticks(yy[:, 0])
plt.scatter(xx, yy, color="red", marker="x")

여기에 이미지 설명을 입력하십시오

기능성

이 함수는 2D에만 국한되지 않고 임의의 차원에서 작동합니다 (파이썬에서 함수에 부여되는 최대 인수 수와 NumPy가 허용하는 최대 수)가 있습니다.

>>> x1, x2, x3, x4 = np.ogrid[:3, 1:4, 2:5, 3:6]
>>> for i, x in enumerate([x1, x2, x3, x4]):
...     print('x{}'.format(i+1))
...     print(repr(x))
x1
array([[[[0]]],


       [[[1]]],


       [[[2]]]])
x2
array([[[[1]],

        [[2]],

        [[3]]]])
x3
array([[[[2],
         [3],
         [4]]]])
x4
array([[[[3, 4, 5]]]])

>>> # equivalent meshgrid output, note how the first two arguments are reversed and the unpacking
>>> x2, x1, x3, x4 = np.meshgrid(np.arange(1,4), np.arange(3), np.arange(2, 5), np.arange(3, 6), sparse=True)
>>> for i, x in enumerate([x1, x2, x3, x4]):
...     print('x{}'.format(i+1))
...     print(repr(x))
# Identical output so it's omitted here.

이것들이 1D에서도 작동하더라도 두 가지 (보다 일반적인) 1D 그리드 생성 기능이 있습니다.

게다가 startstop인수 그것은 또한 지원 step인수 (단계의 수를 나타냅니다 복잡한 단계) :

>>> x1, x2 = np.mgrid[1:10:2, 1:10:4j]
>>> x1  # The dimension with the explicit step width of 2
array([[1., 1., 1., 1.],
       [3., 3., 3., 3.],
       [5., 5., 5., 5.],
       [7., 7., 7., 7.],
       [9., 9., 9., 9.]])
>>> x2  # The dimension with the "number of steps"
array([[ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.]])

응용

목적에 대해 구체적으로 물었고 실제로 이러한 그리드는 좌표계가 필요한 경우 매우 유용합니다.

예를 들어 거리를 2 차원으로 계산하는 NumPy 함수가있는 경우 :

def distance_2d(x_point, y_point, x, y):
    return np.hypot(x-x_point, y-y_point)

그리고 각 점의 거리를 알고 싶습니다.

>>> ys, xs = np.ogrid[-5:5, -5:5]
>>> distances = distance_2d(1, 2, xs, ys)  # distance to point (1, 2)
>>> distances
array([[9.21954446, 8.60232527, 8.06225775, 7.61577311, 7.28010989,
        7.07106781, 7.        , 7.07106781, 7.28010989, 7.61577311],
       [8.48528137, 7.81024968, 7.21110255, 6.70820393, 6.32455532,
        6.08276253, 6.        , 6.08276253, 6.32455532, 6.70820393],
       [7.81024968, 7.07106781, 6.40312424, 5.83095189, 5.38516481,
        5.09901951, 5.        , 5.09901951, 5.38516481, 5.83095189],
       [7.21110255, 6.40312424, 5.65685425, 5.        , 4.47213595,
        4.12310563, 4.        , 4.12310563, 4.47213595, 5.        ],
       [6.70820393, 5.83095189, 5.        , 4.24264069, 3.60555128,
        3.16227766, 3.        , 3.16227766, 3.60555128, 4.24264069],
       [6.32455532, 5.38516481, 4.47213595, 3.60555128, 2.82842712,
        2.23606798, 2.        , 2.23606798, 2.82842712, 3.60555128],
       [6.08276253, 5.09901951, 4.12310563, 3.16227766, 2.23606798,
        1.41421356, 1.        , 1.41421356, 2.23606798, 3.16227766],
       [6.        , 5.        , 4.        , 3.        , 2.        ,
        1.        , 0.        , 1.        , 2.        , 3.        ],
       [6.08276253, 5.09901951, 4.12310563, 3.16227766, 2.23606798,
        1.41421356, 1.        , 1.41421356, 2.23606798, 3.16227766],
       [6.32455532, 5.38516481, 4.47213595, 3.60555128, 2.82842712,
        2.23606798, 2.        , 2.23606798, 2.82842712, 3.60555128]])

개방형 그리드 대신 고밀도 그리드를 통과 한 경우 출력이 동일합니다. NumPys 방송이 가능합니다!

결과를 시각화하자 :

plt.figure()
plt.title('distance to point (1, 2)')
plt.imshow(distances, origin='lower', interpolation="none")
plt.xticks(np.arange(xs.shape[1]), xs.ravel())  # need to set the ticks manually
plt.yticks(np.arange(ys.shape[0]), ys.ravel())
plt.colorbar()

여기에 이미지 설명을 입력하십시오

그리고 이것은 NumPys 경우도 mgrid그리고 ogrid그것은 당신이 쉽게 그리드의 해상도를 변경할 수 있기 때문에 매우 편리하게 :

ys, xs = np.ogrid[-5:5:200j, -5:5:200j]
# otherwise same code as above

여기에 이미지 설명을 입력하십시오

그러나 imshow지원 xy입력을 지원하지 않으므로 틱을 수동으로 변경해야합니다. xy좌표를 받아들이면 정말 편리 할까요?

그리드를 자연스럽게 처리하는 NumPy로 함수를 쉽게 작성할 수 있습니다. 또한 NumPy, SciPy, matplotlib에는 그리드를 전달할 것으로 예상되는 몇 가지 기능이 있습니다.

나는 이미지를 좋아하므로 탐험 해 보자 matplotlib.pyplot.contour.

ys, xs = np.mgrid[-5:5:200j, -5:5:200j]
density = np.sin(ys)-np.cos(xs)
plt.figure()
plt.contour(xs, ys, density)

여기에 이미지 설명을 입력하십시오

좌표가 이미 올바르게 설정되어 있는지 확인하십시오! 방금 전달한 경우에는 그렇지 않습니다 density.

또는 사용하여 다른 재미있는 예를 제공하기 위해 astropy 모델을 (내가 좌표에 대해 많은 관심 없어이 시간, 난 그냥 생성하는 데 사용할 일부 그리드) :

from astropy.modeling import models
z = np.zeros((100, 100))
y, x = np.mgrid[0:100, 0:100]
for _ in range(10):
    g2d = models.Gaussian2D(amplitude=100, 
                           x_mean=np.random.randint(0, 100), 
                           y_mean=np.random.randint(0, 100), 
                           x_stddev=3, 
                           y_stddev=3)
    z += g2d(x, y)
    a2d = models.AiryDisk2D(amplitude=70, 
                            x_0=np.random.randint(0, 100), 
                            y_0=np.random.randint(0, 100), 
                            radius=5)
    z += a2d(x, y)

여기에 이미지 설명을 입력하십시오

그건 그냥 기능 모델 관련 및 피팅 여러 가지 기능 "외모에 대해"비록 (예를 들어 scipy.interpolate.interp2d, scipy.interpolate.griddata심지어 사용 예를 보여 np.mgrid등 Scipy에) 그리드를 필요로한다. 이들 중 대부분은 개방형 그리드 및 고밀도 그리드에서 작동하지만 일부는 이들 중 하나에서만 작동합니다.


이 매우 자세한 답변에 대해 대단히 감사합니다. 이것은 나의 하루를 만들었다.
Jlanger

질문에 대답하는 정말 아름다운 방법입니다. 감사합니다
Bipin

h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)-가로 2km 및 세로 3km이므로 첫 번째 범위에 2를 곱하고 두 번째에 3을 곱해서는 안됩니까?
닉스

@Nixt 불행히도 그렇게 간단하지 않습니다. 답의 해당 부분을 다시 확인해야 할 수도 있습니다. 이것은 전치 행렬의 표시와 역 인덱싱 사이의 절충점입니다. 일반적으로 첫 번째 인덱스는 가로이고 두 번째 세로는 예상되지만 디스플레이는 바뀝니다. 그러나 이것은 대부분 그리드의 이유를 설명하기위한 대답의 본질을 무효화하지 않는 세부 사항입니다. 그러나 나는 이것을 나중에 수정하려고 노력할 것입니다.
MSeifert

36

함수가 있다고 가정하십시오.

def sinus2d(x, y):
    return np.sin(x) + np.sin(y)

예를 들어 0에서 2 * pi 범위의 모양을 확인하려고합니다. 어떻게 하시겠습니까? 있습니다 np.meshgrid:

xx, yy = np.meshgrid(np.linspace(0,2*np.pi,100), np.linspace(0,2*np.pi,100))
z = sinus2d(xx, yy) # Create the image on this grid

그런 음모는 다음과 같습니다.

import matplotlib.pyplot as plt
plt.imshow(z, origin='lower', interpolation='none')
plt.show()

여기에 이미지 설명을 입력하십시오

그래서 np.meshgrid그냥 편리합니다. 원칙적으로 다음을 수행 할 수 있습니다.

z2 = sinus2d(np.linspace(0,2*np.pi,100)[:,None], np.linspace(0,2*np.pi,100)[None,:])

그러나 당신은 당신의 차원 (두 개 이상이 있다고 가정)과 올바른 방송을 알고 있어야합니다. np.meshgrid이 모든 것이 당신을 위해합니다.

또한 예를 들어 보간을 원하지만 특정 값을 제외하려는 경우 meshgrid를 사용하면 데이터와 함께 좌표를 삭제할 수 있습니다.

condition = z>0.6
z_new = z[condition] # This will make your array 1D

이제 보간을 어떻게 하시겠습니까? 다음 xy같이 보간 함수를 제공 하고 scipy.interpolate.interp2d삭제할 수 있으므로 어떤 좌표가 삭제되었는지 알 수있는 방법이 필요합니다.

x_new = xx[condition]
y_new = yy[condition]

그런 다음 "올바른"좌표로 보간 할 수 있습니다 (meshgrid없이 시도하면 추가 코드가 많이 있습니다).

from scipy.interpolate import interp2d
interpolated = interp2d(x_new, y_new, z_new)

원본 메쉬 그리드를 사용하면 원래 그리드에서 보간을 다시 얻을 수 있습니다.

interpolated_grid = interpolated(xx[0], yy[:, 0]).reshape(xx.shape)

이것들은 내가 meshgrid더 많이 사용할 수있는 몇 가지 예 입니다.


1
답변 주셔서 감사합니다! 나에게 가장 혼란 순간 값을 반환됩니다 xx, yy. 그것들이 무엇인지, 왜 함수를 계산하기 위해 그것들을 사용하는지 이해하기 어려웠습니다. 알 겠어요. 좌표를 기준으로 함수를 계산하려고합니다. 다음과 같이 작성할 수 있습니다. for x=1:10: for y=1:10: z[x,y]=sin(x)+sin(y)대신 z다른 방식으로 계산 z=sin([x,x,...,x]) + sin([y,y,..y])합니다. 내가 틀렸다면 정정해라!
Alena Kastsiukavets

100 % 정확한 의사 코드는 아니지만 내 요점을 알기를 바랍니다)
Alena Kastsiukavets

실제로 항상 이중 루프 (첫 번째 코드)가 필요합니다. 그러나 numpy메쉬 그리드 또는 브로드 캐스트를 사용 하여 보관 하는 방법에는 여러 가지가 있습니다. 포인트를 버리지 않으면 (내 답변의 마지막 부분 참조) 실제로 기능적으로 동일합니다. 브로드 캐스팅은 브로드 캐스트 대상 차원 전체에 대한 암시 적 루프입니다. 결과를 올바르게 방송 할 수 있도록 추가 치수를 사용 [:,None]하고 [None, :]포함했습니다. 두 번째 예는 다음과 같습니다.sin([[y],[y],..[y]])
MSeifert

정말 좋은 그림입니다. 많은 노력을 기울여 주셔서 감사합니다.
natersoz

interpolated_grid = interpolated(xx, yy)-이것은 작동하지 않습니다. 오류 :x and y should both be 1-D arrays
Nixt

4

meshgrid는 두 배열에서 모든 점 쌍의 두 개의 1 차원 배열에서 직사각형 격자를 만드는 데 도움이됩니다.

x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 1, 2, 3, 4])

이제 함수 f (x, y)를 정의하고 배열 'x'와 'y'의 가능한 모든 포인트 조합에이 함수를 적용하려면 다음을 수행하십시오.

f(*np.meshgrid(x, y))

함수가 두 요소의 곱을 생성하는 경우 대형 배열에 대해 직교 곱을 효율적으로 얻을 수있는 방법입니다.

여기 에서 추천


1

기본 아이디어

주어 가능한 X 값은 xs, 가능한 한 Y 값 (ㄱ 그래프의 X 축에 틱 부호로 생각) ys, meshgrid유사 (x, y)의 격자 점 ---의 대응 세트를 생성한다 set((x, y) for x in xs for y in yx). 예를 들어 if xs=[1,2,3]ys=[4,5,6]이면 좌표 세트를 얻습니다.{(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)} 됩니다.

반환 값의 형태

그러나 meshgrid반환하는 표현은 두 가지면에서 위의 표현과 다릅니다.

우선 , meshgrid2 차원 배열의 격자 점을 낳는다 : 행 상이한 y 값에 대응하는, 칼럼과 --- 다른 x 값에 대응하는 list(list((x, y) for x in xs) for y in ys)다음의 배열을 제공하는 것이다 :

   [[(1,4), (2,4), (3,4)],
    [(1,5), (2,5), (3,5)],
    [(1,6), (2,6), (3,6)]]

Second , meshgridx 및 y 좌표를 별도로 반환합니다 (예 : 두 개의 다른 numpy 2d 배열).

   xcoords, ycoords = (
       array([[1, 2, 3],
              [1, 2, 3],
              [1, 2, 3]]),
       array([[4, 4, 4],
              [5, 5, 5],
              [6, 6, 6]]))
   # same thing using np.meshgrid:
   xcoords, ycoords = np.meshgrid([1,2,3], [4,5,6])
   # same thing without meshgrid:
   xcoords = np.array([xs] * len(ys)
   ycoords = np.array([ys] * len(xs)).T

참고 np.meshgrid또한 더 높은 차원의 격자를 생성 할 수있다. xs, ys 및 zs가 주어지면 xcoords, ycoords, zcoords를 3d 배열로 되돌릴 수 있습니다. meshgrid또한 차원의 역순 정렬과 결과의 희소 한 표현을 지원합니다.

응용

왜 이런 형태의 출력을 원할까요?

그리드의 모든 지점에 함수를 적용하십시오. 한 가지 동기는 (+,-, *, /, **)와 같은 이진 연산자가 요소 배열 연산으로 numpy 배열에 대해 오버로드되는 것입니다. 이 수단이 내가하는 기능이있는 경우 def f(x, y): return (x - y) ** 2두 개의 스칼라의 작품, 나는 또한 elementwise 결과의 배열을 가져 오는 두 NumPy와 배열에 적용 할 수 있음 : 예를 f(xcoords, ycoords)하거나 f(*np.meshgrid(xs, ys))하여 위의 예에서 다음 제공을 :

array([[ 9,  4,  1],
       [16,  9,  4],
       [25, 16,  9]])

더 높은 차원의 외부 제품 : 이것이 얼마나 효율적인지 잘 모르겠지만 다음과 같은 방법으로 높은 차원의 외부 제품을 얻을 수 있습니다 np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0).

matplotlib의 등고선 플롯 : 결정 경계플롯하기 위해 matplotlib도면 등고선 플롯을meshgrid 조사 할 때 나타 났습니다 . 이를 위해을 사용하여 그리드를 생성하고 각 그리드 포인트에서 함수를 평가 한 다음 (예 : 위 그림 참조) xcoords, ycoords 및 계산 된 f- 값 (예 : zcoords)을 contourf 함수에 전달합니다.meshgrid

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.