programing

Python / NumPy에서 메시 그리드의 목적은 무엇입니까?

shortcode 2022. 11. 24. 21:19
반응형

Python / NumPy에서 메시 그리드의 목적은 무엇입니까?

의 목적이 무엇인지 누가 설명해 주시겠습니까?meshgridNumpy 서 num num num num num num?그래프가 좌표의 격자를 만들어 내는 건 알지만 직접적인 이점은 잘 모르겠어요

저는 세바스찬 라슈카의 "피톤 머신 러닝"을 공부하고 있는데, 그는 그것을 의사결정 경계를 그리는 데 사용하고 있습니다.여기에서 입력 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)

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

★★★의 meshgrid는 x 과 y입니다.x 는 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

되면 가 됩니다.x ★★★★★★★★★★★★★★★★★」y행렬, 즉 각 행렬에서 해당 요소의 쌍이 그리드에 있는 점의 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 ★★★★★★★★★★★★★★★★★」ymeshgrid 실제로 할 수 가 있는 은, 「유니크」의 「유니크」의 「유니크한 「유니크」를 지정하기만 하면 됩니다.특정할 수 있는 것은, 그 일의뿐입니다.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)의 값 )를 참조해 주세요.x ★★★★★★★★★★★★★★★★★」y

이 함수는 직사각형 그리드에서 샘플링되었기 때문에 이제 함수를 "이미지"로 시각화할 수 있습니다.

여기에 이미지 설명 입력

직사각형 직사각형 그리드) 상의 에 결과를 전달할 수(예: 또 、 또 、 사 、 사 、 사 、 사 、 사 、 사 ) 。contourf)

Microsoft Excel 제공:

여기에 이미지 설명 입력

★★★★★★★★★★★★★★★★★★★★★★★★★★의 목적np.meshgrid되어 있습니다.

np.meshgrid

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

1차원 좌표 배열 x1, x2, ..., xn이 주어졌을 때 N-D 스칼라/벡터 필드를 벡터화 평가하도록 N-D 좌표 배열로 만듭니다.

그래서 이것의 주된 목적은 좌표 행렬을 만드는 것입니다.

아마 스스로에게 물어봤을 겁니다.

좌표 행렬을 작성해야 하는 이유는 무엇입니까?

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

데이터가 다음과 같다고 가정합니다.

1  2  1
2  5  2
1  2  1

단, 각 값은 3 x 2km 영역(수평 x 수직)을 나타냅니다.원점이 왼쪽 상단 모서리이고 사용할 수 있는 거리를 나타내는 배열이 필요하다고 가정합니다.

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]])

두 개 지수를 두 개 가지고 있다, 됩니다.x ★★★★★★★★★★★★★★★★★」y (의)meshgridxx ★★★★★★★★★★★★★★★★★」xsx, 나는 이우경 in를 선택했다.h을 사용하여 점의x , 및 수 . 그러면 다음을 사용하여 점의 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=True 「」)를해 주세요.sparse가 됩니다.np.meshgrid) 。「 」 에는 큰 해 주세요.np.meshgrid ★★★★★★★★★★★★★★★★★」np.ogrid ★★★★★★★★★★★★★★★★★」np.mgrid: 처음 2개의 반환된 값(2개 이상 있는 경우)은 반전됩니다.대부분의 경우 이는 중요하지 않지만 컨텍스트에 따라 의미 있는 변수 이름을 지정해야 합니다.

를 들어와 2D 그리드의 2D 그리드의 경우matplotlib.pyplot.imshow 반환된 을 붙이는 은 의미가 있다.np.meshgrid x 두 거.ynp.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, xxxx, 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]])
       

이치노은 음음음 음음 음음음 the the the the the the the the the the the the에 비해 거꾸로 되어 있습니다.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 어레이는 모두 xx ★★★★★★★★★★★★★★★★★」yy= <= <= <= 5.-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에 한정되지 않고, 이러한 함수는 임의의 차원에 대해 동작합니다(Python에서 기능하기 위해 주어진 인수의 최대 수와 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에도 적용되더라도 2개의 1D 그리드 생성 기능이 있습니다(더 일반적입니다.

★★★★외start ★★★★★★★★★★★★★★★★★」stop는 「」도 합니다.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가 NumPys를 사용할 때도 마찬가지입니다.mgrid ★★★★★★★★★★★★★★★★★」ogrid그리드의 해상도를 쉽게 변경할 수 있기 때문에 매우 편리해집니다.

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

여기에 이미지 설명 입력

「」이기 때문에, 「」는 「」입니다.imshow 「」을 서포트하고 않습니다.x ★★★★★★★★★★★★★★★★★」y입력은 손으로 체크 표시를 바꿔야 합니다. 그것이 편리할 입니다.x ★★★★★★★★★★★★★★★★★」y,,, ???

NumPy로 그리드에 자연스럽게 대응하는 함수를 쉽게 작성할 수 있습니다.또한 NumPy, SciPy, matplotlib에는 그리드를 통과할 것으로 예상되는 여러 함수가 있습니다.

이미지를 좋아하기 때문에 다음 내용을 살펴보겠습니다.

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.

또는 아스트로피 모델을 사용한 또 다른 재미있는 예를 들 수 있습니다(이번에는 좌표에 크게 신경 쓰지 않고 그리드를 만드는 데 사용합니다).

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)
    

여기에 이미지 설명 입력

기능 모델 및 피팅과 관련된 몇 가지 기능(예를 들어, 를 사용한 예도 표시)에 불과하지만,np.mgrid섬뜩한이들 대부분은 오픈 그리드 및 고밀도 그리드에서 작동하지만 일부는 이들 중 하나에서만 작동합니다.

다음과 같은 함수가 있다고 가정합니다.

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이 모든 게 널 위한 거야

또한 메시 그리드를 사용하면 보간 작업을 수행하지만 특정 값을 제외하려는 경우 데이터와 함께 좌표를 삭제할 수 있습니다.

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

럼럼 이떻 어떻 떻간 간? ???줄 수 있다x ★★★★★★★★★★★★★★★★★」y인 ' 함수로 됩니다.scipy.interpolate.interp2d어떤 좌표가 삭제되었는지 알 수 있는 방법이 필요합니다.

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

그런 다음 올바른 좌표를 사용하여 보간할 수 있습니다(메쉬 그리드를 사용하지 않고 시도하면 많은 추가 코드가 생성됩니다).

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

원본 메시 그리드를 사용하면 원본 그리드에서 보간 작업을 다시 수행할 수 있습니다.

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

를 들면, 예를 , 예를 들면, 를 들 수 있습니다.meshgrid더 많을 수도 있어요

단답

★★★의 meshgridPython 루프(느린 인터프리터 코드)를 C NumPy 라이브러리 내에서 벡터화된 연산으로 대체하기 위한 입니다.

이 사이트에서 빌렸습니다.

여기에 이미지 설명 입력

x = np.arange(-4, 4, 0.25)
y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

meshgrid4하기 위해 각 에서 0. 증분합니다 -4와 +4는 X와 Y의 각 방향에서 +4는 X의 Y로 0.25는 0.25입니다.RZ로 하다이러한 좌표의 "격자"를 준비하는 방법은 3D 표면을 그리거나 2D 표면을 색칠하는 데 자주 사용됩니다.


세부사항:Python for-loop vs NumPy 벡터 연산

좀 더 간단한 예를 들어 두 가지 값의 시퀀스가 있다고 합시다.

a = [2,7,9,20]    
b = [1,6,7,9]    ​

가능한 각 값의 쌍에 대해 연산을 수행합니다.하나는 첫 번째 목록에서, 다른 하나는 두 번째 목록에서 가져옵니다.저희도 결과를 저장하고 싶습니다.예를 들어, 가능한 각 쌍에 대한 값의 합계를 구한다고 가정합니다.

느리고 힘든 방법

c = []    
for i in range(len(b)):    
    row = []    
    for j in range(len(a)):    
        row.append (a[j] + b[i])
    c.append (row)    
print (c)

결과:

[[3, 8, 10, 21],
 [8, 13, 15, 26],
 [9, 14, 16, 27],
 [11, 16, 18, 29]]

Python을 해석하면 이러한 루프는 실행 속도가 비교적 느립니다.

빠르고 쉬운 방법

meshgrid는, 코드에서 루프를 삭제하는 것을 목적으로 하고 있습니다.아래의j를 수 .이 어레이를 조합하면 다음과 같이 기존의 모든 페어를 스캔할 수 있습니다.

i,j = np.meshgrid (a,b)    
c = i + j    
print (c)

결과:

[[ 3  8 10 21]
 [ 8 13 15 26]
 [ 9 14 16 27]
 [11 16 18 29]]

후드 밑의 메쉬

의 는 2개의 어레이를 했습니다.meshgrid과 같습니다

(array([[ 2,  7,  9, 20],
        [ 2,  7,  9, 20],
        [ 2,  7,  9, 20],
        [ 2,  7,  9, 20]]),

 array([[1, 1, 1, 1],
        [6, 6, 6, 6],
        [7, 7, 7, 7],
        [9, 9, 9, 9]]))

이러한 배열은 제공된 값을 반복하여 생성됩니다.하나는 동일한 행에 값을 포함하고 다른 하나는 동일한 열에 다른 값을 포함합니다.행과 열의 수는 다른 시퀀스의 요소 수에 따라 결정됩니다.

2개의 는 2개의 어레이로 .meshgrid따라서 벡터 연산에 적합한 모양입니다.페이지 맨 위에 있는 코드의 x 및 y 시퀀스에 다른 수의 요소가 포함되어 있다고 상상해 보십시오. X 및 Y 결과 배열은 브로드캐스트를 필요로 하지 않고 쉐이핑 호환성이 있습니다.

기원.

numpy.meshgrid다른 많은 NumPy 함수와 마찬가지로 MATLAB에서 가져옵니다.따라서 MATLAB의 예를 연구하여meshgridMATLAB에서 3D 플롯의 코드는 동일하게 보입니다.

메시 그리드는 두 배열의 모든 점 쌍으로 구성된 두 개의 1-D 배열에서 직사각형 그리드를 작성하는 데 도움이 됩니다.

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))

예를 들어, 함수가 2개의 요소의 곱만 생성한다고 가정하면, 이것이 대규모 어레이에 대해 효율적으로 데카르트 곱을 실현할 수 있는 방법입니다.

여기서부터의 참조

기본 개념

값 「x」가 지정되면,xs) 및 x축의 체크마크)입니다.ys,meshgrid하는 (합니다.-는 (x, y)에 대한 것입니다.set((x, y) for x in xs for y in yx)를 들어, '만나면' 이런 거 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그리드 점을 합니다. 은 서로 다른 y은 서로 다른 x 합니다. - 에서와 2D 배열에 해당합니다. 행은 서로 다른 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)]]

둘째,meshgrid는 x 및 y 좌표를 개별적으로 반환합니다(즉, 2개의 다른 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,, 배열로 x, y, z는 xcoord, zcoord는 3D로 반환됩니다. meshgrid는 치수의 역순서와 결과의 희박한 표현도 지원합니다.

적용들

왜 이런 형태의 출력을 원합니까?

그리드의 모든 점에 함수를 적용합니다.한 가지 이유는 numpy 배열에 대해 (+, -, *, /, **)와 같은 이진 연산자가 요소별 연산으로 오버로드되기 때문입니다.즉, 만약 내가 기능을 가지고 있다면def f(x, y): return (x - y) ** 2, 2개의 할 수 를 들어, 2개의 numpy 배열은 2개의 numpy 배열로 2개의 numpy 배열은 2개의 numpy 배열로 구성되며, 즉 2개의 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의 등고선도:우연히 알게 되었다meshgrid결정 경계표시하기 위해 matplotlib를 사용하여 도면 등고선도를 조사하는 경우.이를 위해 다음과 같은 그리드를 생성합니다.meshgrid각 그리드 지점에서 함수를 평가한 다음(예: 위와 같이), xcoord, ycoord 및 계산된 f-값(예: zcoord)을 등고선 함수로 전달합니다.

비하인드:

import numpy as np

def meshgrid(x , y):
    XX = []
    YY = []
    for colm in range(len(y)):
        XX.append([])
        YY.append([])
        for row in range(len(x)):
            XX[colm].append(x[row])
            YY[colm].append(y[colm])
    return np.asarray(XX), np.asarray(YY)

@Sarsaparilla의 답변 데이터 세트를 예로 들어 보겠습니다.

y = [7, 6, 5]
x = [1, 2, 3, 4]

xx, yy = meshgrid(x , y)

출력:

>>> xx
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])

>>> yy
array([[7, 7, 7, 7],
       [6, 6, 6, 6],
       [5, 5, 5, 5]])

, 당신은 단지 한 것입니다.list(zip(X,Y))서 ''는X = np.linspace(x) ★★★★★★★★★★★★★★★★★」Y = np.linspace(y)

언급URL : https://stackoverflow.com/questions/36013063/what-is-the-purpose-of-meshgrid-in-python-numpy

반응형