Python / NumPy에서 메시 그리드의 목적은 무엇입니까?
의 목적이 무엇인지 누가 설명해 주시겠습니까?meshgrid
Numpy 서 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
★★★★★★★★★★★★★★★★★」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)
의 값 )를 참조해 주세요.x
★★★★★★★★★★★★★★★★★」y
이 함수는 직사각형 그리드에서 샘플링되었기 때문에 이제 함수를 "이미지"로 시각화할 수 있습니다.
직사각형 직사각형 그리드) 상의 에 결과를 전달할 수(예: 또 、 또 、 사 、 사 、 사 、 사 、 사 、 사 ) 。contourf
)
Microsoft Excel 제공:
★★★★★★★★★★★★★★★★★★★★★★★★★★의 목적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
(의)meshgrid
xx
★★★★★★★★★★★★★★★★★」xs
x
, 나는 이우경 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.ogrid
sparse=True
「」)를해 주세요.sparse
가 됩니다.np.meshgrid
) 。「 」 에는 큰 해 주세요.np.meshgrid
★★★★★★★★★★★★★★★★★」np.ogrid
★★★★★★★★★★★★★★★★★」np.mgrid
: 처음 2개의 반환된 값(2개 이상 있는 경우)은 반전됩니다.대부분의 경우 이는 중요하지 않지만 컨텍스트에 따라 의미 있는 변수 이름을 지정해야 합니다.
를 들어와 2D 그리드의 2D 그리드의 경우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]])
이치노은 음음음 음음 음음음 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
더 많을 수도 있어요
단답
★★★의 meshgrid
Python 루프(느린 인터프리터 코드)를 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)
meshgrid
4하기 위해 각 에서 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의 예를 연구하여meshgrid
MATLAB에서 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
'programing' 카테고리의 다른 글
기본 제공 DOM 메서드 또는 프로토타입을 사용하여 HTML 문자열에서 새 DOM 요소 만들기 (0) | 2022.12.24 |
---|---|
JavaScript에서 setAttribute vs .timeout=을 사용해야 하는 시기는 언제입니까? (0) | 2022.12.24 |
인덱스로 두 데이터 프레임 병합 (0) | 2022.11.24 |
프로세스가 실행되는 동안 하위 프로세스 출력을 지속적으로 인쇄합니다. (0) | 2022.11.24 |
JDBC에서 접속 풀을 확립하려면 어떻게 해야 합니까? (0) | 2022.11.24 |