Python / NumPyでのmeshgridの目的は何ですか?


302

誰かmeshgridがNumpy の関数の目的は何かを私に説明できますか?プロットのためにある種の座標グリッドを作成することは知っていますが、その直接的な利点は本当にわかりません。

私はセバスチャン・ラシュカの「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)

できれば、実際の例もたくさん見せてください。

回答:


391

の目的はmeshgrid、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

これにより、以下の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実際に私たちのためにこれを生成することができます。私たちは指定する必要があり、すべてがユニークであるxy値。

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)に渡すことができます。


10
戻り値xxとを説明していませんyy。私にとって不思議なのは、その結果のペアが返される理由と、それらがどのように見えるかです。ハイファンの答えはそのために便利です。plotはそのような2つのパラメータを必要としているので、便宜上それを行うと思います。
nealmcb

2
わからない-それが私がこの情報を調べている理由です;)だから私はそれが何か違うものを返すはずだと言っているのではありません。私は、受け入れられた回答を読んだばかりの人のために、欠けている情報を推測しています。必要に応じて、返答値を(Haiが行ったように)説明すると、答えが(もう非常に良いですが、ありがとう!)もう少し完全になることをお勧めします。
nealmcb

1
より良いXXとYYの値を理解するために、次のコードは、あなたにnp.meshgridと同じ結果を得ることを、主張を考慮してくださいxx = [xvalues for y in yvalues] yy = [[y for x in xvalues] for y in yvalues]
マットKleinsmith

1
この答えは紛らわしいです-あなたの最初のイラストとxそのy逆ではありませんか?あなたがするときxx, yy = np.meshgrid(np.arange(4), np.arange(4))、それはあなたが持っているものxy答えの最初の部分の逆です。の出力の順序と一致しますがmgrid、meshgrid とは一致しません。xxx方向に増加しなければならないが、あなたは、Y方向に増加します。
スコットスタニーウィッツ2018

1
@ScottStaniewiczそれを指摘してくれてありがとう
Suever、2018

249

Microsoft Excelの礼儀: 

ここに画像の説明を入力してください


6
いいね。Fwiw、中央にペアの2 x 12配列が必要な場合:XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
denis

5
中央にペアの12 x 2配列が必要な場合:XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
barlaensdoonn

2
素敵な答え。meshgridの目的は、各dimの座標を使用してグリッドを作成することです。
グッドボーイ

1
私が少し奇妙だと思うのは、xとyの値が既に1つの配列に結合されているのではなく、別々に返されることです。それらを1つのアレイにしたい場合は、次のようにする必要がありますnp.vstack([XX.ravel(), YY.ravel()]).T
。– user3629892

64

実際にの目的np.meshgridはすでにドキュメントで言及されています:

np.meshgrid

座標ベクトルから座標行列を返します。

1次元座標配列x1、x2、...、xnを指定して、NDグリッド上のNDスカラー/ベクトルフィールドのベクトル化された評価のためのND座標配列を作成します。

したがって、それは主な目的が座標行列を作成することです。

あなたはたぶん自分自身に尋ねました:

なぜ座標行列を作成する必要があるのですか?

Python / NumPyで座標行列が必要な理由は、座標がゼロで始まり、純粋に正の整数である場合を除いて、座標から値への直接の関係がないためです。次に、配列のインデックスをインデックスとして使用できます。ただし、そうでない場合は、どういうわけかデータと一緒に座標を格納する必要があります。そこでグリッドが登場します。

あなたのデータが:

1  2  1
2  5  2
1  2  1

ただし、各値は、水平方向に2キロメートル、垂直方向に3キロメートルの領域を表しています。原点が左上隅であり、使用できる距離を表す配列が必要だとします。

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

あなたは2つのインデックス、letのだと言う持っているのであれば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及びケース(私は参照の引数)。and との間には大きな違いがあることに注意してください 。最初の2つの戻り値(2つ以上ある場合)は逆になります。多くの場合これは重要ではありませんが、コンテキストに応じて意味のある変数名を指定する必要があります。np.ogridsparse=Truesparsenp.meshgridnp.meshgridnp.ogridnp.mgrid

例えば、2次元グリッドの場合とではmatplotlib.pyplot.imshow、それは最初に返さ項目名前に意味をなすnp.meshgrid x2つ目をy、それが周りのための他の方法だながらnp.mgridnp.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に限定されず、これらの関数は任意の次元で機能します(まあ、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グリッド作成関数があります。

startand 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ときもある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などの機能モデルおよびフィッティングに関連するいくつかの関数(たとえばscipy.interpolate.interp2dscipy.interpolate.griddataを使用した例を示すことさえnp.mgrid)にはグリッドが必要です。これらのほとんどはオープングリッドとデンスグリッドで機能しますが、一部はそれらの1つでのみ機能します。


私は、この非常に詳細な答えに感謝します。これは私の日を作りました。
Jlanger

質問に答えるのになんと美しい方法だと思いますか。ありがとう
Bipin

h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)-水平2 km、垂直3 kmなので、最初の範囲に2を掛け、2番目に3を掛けるべきではありませんか。
Nixt

@Nixt残念ながらそれはそれほど単純ではありません。答えのその部分をもう一度確認する必要があるかもしれません。これは、マトリックスの転置表示と逆インデックス付けの間のトレードオフです。通常、最初のインデックスは水平で、2番目は垂直であると予想されますが、表示は転置されます。しかし、これはグリッドの理由を説明することを目的とする回答の本質を無効にしないことが望ましい詳細のほとんどです。しかし、私はこれを将来修正するように努めます。
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,:])

ただし、ディメンション(2つ以上あると想定...)と適切なブロードキャストに注意する必要があります。np.meshgridあなたのためにこれをすべて行います。

また、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]

その後、「正しい」座標で補間することができます(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 2016年

それは100%正しい疑似コードではありませんが、私のポイントがわかると思います)
Alena Kastsiukavets

実際には、常に二重ループ(最初のコード)が必要です。しかし、それをアーカイブするには、numpymeshgridまたはブロードキャストのさまざまな方法があります。ポイントを破棄しない場合(私の回答の最後の部分を参照)、どちらも実際には機能的に同等です。ブロードキャストは、ブロードキャストされるディメンション全体の暗黙的なループにすぎません。結果を正しくブロードキャストするために、追加のディメンションを使用[:,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は、2つの配列からのポイントのすべてのペアの2つの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))

たとえば、関数が2つの要素の積を生成するだけであれば、これがデカルト積を実現できる方法であり、大規模配列に対して効率的です。

ここから紹介


1

基本的な考え方

可能なx値xs(プロットのx軸の目盛りと考えてください)と可能なy値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返される表現は上記の式と次の2つの点で異なります。

まずmeshgridグリッドポイントを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)]]

次にmeshgridx座標と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、ys、zsを指定すると、xcoords、ycoords、zcoordsが3D配列として返されます。meshgridは、ディメンションの逆順や、結果のスパース表現もサポートしています。

用途

なぜこの形式の出力が必要なのでしょうか。

グリッド上のすべての点に関数を適用します 。1つの動機は、(+、-、*、/、**)のような2項演算子が要素単位の演算としてnumpy配列に対してオーバーロードされることです。この場合、私は機能があることを意味def f(x, y): return (x - y) ** 22つのスカラーの作品は、私も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各グリッドポイントで関数を評価し(たとえば、上記のように)、xcoords、ycoords、および計算されたf値(zcoords)を関数contourfに渡します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.