NumPy の `np.meshgrid()` を徹底解説:なぜ必要なのか?順序を入れ替えるとどうなるのか?

Python や NumPy を使ってデータ分析や科学計算をしていると、np.meshgrid() という関数を見かけたことがあるかもしれません。ですが、次のような疑問を持つ人も多いでしょう:

  • meshgrid() は何のために使うの?
  • 引数の順序を入れ替えるとどうなる?
  • meshgrid() を使わなかったらどうなる?
  • プロットや関数の評価とどう関係するの?

この記事では、これらの疑問をわかりやすく説明します。


🧠 meshgrid() はなぜ必要なのか?

例えば次のような関数を評価したいとします:

f(x, y) = x^2 + y^2

そして、x と y の値が以下だとします:

x = [1, 2, 3]
y = [10, 20]

このとき、すべての x と y の組み合わせ に対して関数を計算するには、座標の「グリッド」が必要になります:

(1,10), (2,10), (3,10), (1,20), (2,20), (3,20)

これを実現するには、単なる1次元配列では不十分です。2次元の座標行列が必要になります。

np.meshgrid() を使えば、それを簡単に作成できます。


🔧 meshgrid() の基本的な使い方

import numpy as np

x = np.array([1, 2, 3])
y = np.array([10, 20])

X, Y = np.meshgrid(x, y)

結果は次のようになります:

X = [[1 2 3]
     [1 2 3]]

Y = [[10 10 10]
     [20 20 20]]

このように、(X[i,j], Y[i,j]) が各座標点を表します:

  • (1,10), (2,10), (3,10)
  • (1,20), (2,20), (3,20)

📈 3Dグラフのプロットに使う

次に、Z値を計算します:

Z = X**2 + Y**2

これを 3D サーフェスプロットで可視化できます:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()

meshgrid() を使うことで、こうしたプロットがとても簡単に実現できます。


🚫 meshgrid() を使わなかったら?

試しに meshgrid() を使わずにやってみましょう:

x = np.array([1, 2, 3])
y = np.array([10, 20])

# ダメな例
z = x**2 + y**2

これはエラーになるか、意図しない結果になります。
というのも、xy の形状が違っていて、NumPy のブロードキャスト規則では対応できないからです。

一応、ループでやればできますが:

z = []
for yi in y:
    for xi in x:
        z.append(xi**2 + yi**2)

これはコードが冗長で遅く、NumPy の高速なベクトル演算の利点が活かせません。

✅ だからこそ、meshgrid() が必要なのです。


🔄 引数の順序を入れ替えたらどうなる?

今度は順序を逆にしてみましょう:

Y2, X2 = np.meshgrid(y, x)

結果:

X2 = [[1 1]
      [2 2]
      [3 3]]

Y2 = [[10 20]
      [10 20]
      [10 20]]
  • 配列の形状が (3, 2) になります(もともとは (2, 3)
  • 各行が x 値、各列が y 値になり、座標の並びも変わります
  • グラフでプロットする場合、軸の方向が変わるため、意図しない表示になることもあります

🧭 行列スタイルで使うには indexing='ij' を指定

デフォルトでは indexing='xy' が使われ、グラフ描画に適した形式になります。

もし行列・テンソルのインデックスに合わせたい場合は、次のようにします:

X, Y = np.meshgrid(x, y, indexing='ij')

これで:

  • X が行(i方向)
  • Y が列(j方向)

になります。


✅ まとめ

項目 デフォルト (xy) indexing='ij' または順序入替
x の方向 横(列) 縦(行)
y の方向 縦(行) 横(列)
形状 (len(y), len(x)) (len(x), len(y))
主な用途 グラフ描画 行列演算、テンソル処理

🧪 最後に

meshgrid() は次のような用途で非常に便利な関数です:

  • 2次元・3次元座標の生成
  • 多変数関数の一括評価
  • サーフェスや等高線のグラフ描画
  • 数値シミュレーションや物理モデル構築

使わない場合はコードが複雑になり、NumPy の強力なベクトル処理が活かせません。
科学計算や機械学習では必須のテクニックといえます。


Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products