質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1087閲覧

numpy.meshgridの仕組みについて

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/14 18:08

例えば

a = [1, 2] b = [1, 2, 3] c = [1, 2, 3, 4]

を用いて、

aa, bb = numpy.meshgrid(a, b) aaa, bbb, ccc = numpy.meshgrid(a, b, c)

とすると例えばaa, aaaはそれぞれ

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

となりますが、どういう規則でこうなるのかが理解できません。
つまり、meshgridを使ってできるものがどういう形でどの成分が何になるのかを実際に表示してみないと認知できません。

上の場合や、それ以上の次元の場合でも統一的に理解できる方法はないでしょうか。
どなたかご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

meshgrid() をどのように使用するのかがわかると理解が進むかと思います。

とりあえず2次元で。

まず、

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

の配列をX軸

y = [10,20,30,40,50]

の配列をY軸として

-123456789
10
20
30
40
50

のような表を作り、各要素をx値とy値から

f(x,y) = x + y

-123456789
10111213141516171819
20212223242526272829
30313233343536373839
40414243444546474849
50515253545556575859

のように埋めることを考えます。

この時に、予め上のような表に各要素毎のx値とy値を埋めたものを生成してくれるのが meshgrid() です。

説明を簡単にするため表として記述しましたが実際は行列です

実際にコードをおよび結果は以下のとおり

Python

1import numpy as np 2 3x = [1,2,3,4,5,6,7,8,9] 4y = [10,20,30,40,50] 5 6X,Y = np.meshgrid(x,y) 7print(X) 8# => [[1 2 3 4 5 6 7 8 9] 9# [1 2 3 4 5 6 7 8 9] 10# [1 2 3 4 5 6 7 8 9] 11# [1 2 3 4 5 6 7 8 9] 12# [1 2 3 4 5 6 7 8 9]] 13 14print(Y) 15# => [[10 10 10 10 10 10 10 10 10] 16# [20 20 20 20 20 20 20 20 20] 17# [30 30 30 30 30 30 30 30 30] 18# [40 40 40 40 40 40 40 40 40] 19# [50 50 50 50 50 50 50 50 50]]

このような座標行列を予め作成しておくことより、各セルの値

f(x,y) = x + y は

Python

1print(X+Y) 2# => [[11 12 13 14 15 16 17 18 19] 3# [21 22 23 24 25 26 27 28 29] 4# [31 32 33 34 35 36 37 38 39] 5# [41 42 43 44 45 46 47 48 49] 6# [51 52 53 54 55 56 57 58 59]]

のようにシンプルに求めることができます。

以上2次元にて説明しましたが、多次元でも考え方は全く一緒となります。

投稿2018/11/15 01:11

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/15 16:42

詳細な解説ありがとうございます。 概ね理解できました。 追加の質問なのですが、 ``` z = [100, 200, 300] ``` として、meshgridを用いて ``` X + Y + Z = [[[111, 112, 113, 114, 115, 116, 117, 118, 119], [121, 122, 123, 124, 125, 126, 127, 128, 129], [131, 132, 133, 134, 135, 136, 137, 138, 139], [141, 142, 143, 144, 145, 146, 147, 148, 149], [151, 152, 153, 154, 155, 156, 157, 158, 159]], [[211, 212, 213, 214, 215, 216, 217, 218, 219], [221, 222, 223, 224, 225, 226, 227, 228, 229], [231, 232, 233, 234, 235, 236, 237, 238, 239], [241, 242, 243, 244, 245, 246, 247, 248, 249], [251, 252, 253, 254, 255, 256, 257, 258, 259]], [[311, 312, 313, 314, 315, 316, 317, 318, 319], [321, 322, 323, 324, 325, 326, 327, 328, 329], [331, 332, 333, 334, 335, 336, 337, 338, 339], [341, 342, 343, 344, 345, 346, 347, 348, 349], [351, 352, 353, 354, 355, 356, 357, 358, 359]]] ``` の様に(つまり数字がきれいに並ぶ様に)したいときに、 ``` X, Y, Z = np.meshgrid(x, y, z) ``` ではなく ``` X, Y, Z = np.meshgrid(y, z, x) ``` としないとうまくいかなかったのですが、 ここはどう理解すればよいでしょうか。 同じように4次元(= x, y, z, w)の場合も ``` X, Y, Z, W = np.meshgrid(w, z, x, y) ``` としないとX + Y + Z+ Wがきれいな配列になりません。
magichan

2018/11/16 05:17

なるほど根本の疑問は各軸をどの次元に割り振るのかというお話なのですね。 これはどうやら X軸(1番目)とY軸(2番目)のみの順番が逆になるようになっているようです。 なぜこのようになっているかの実際の理由はわかりませんが、基本的に mashgridは グラフを書く際の格子状のデータを作成するために用いられ、2次元のグラフの場合は横軸にX軸、縦軸にY軸ととるので、これらを入れ替えた方が行列のデータがグラフと対となるので直感的に扱いやすいからかと思います。 あと、特にグラフに書く用途で仕様するわけでは無い場合、を meshgrid() の引数に indexing='ij' を渡すことで X軸とY軸が入れ替わらないようになるようです。(これは今回始めて知りました)
退会済みユーザー

退会済みユーザー

2018/11/18 12:03 編集

回答ありがとうございます。 グラフを描く際のメッシュ作成に使うことを意識したらなんとなく意味が見えてきました。X軸Y軸についてだけ実際上の都合で逆になってるだけ?ですね。
magichan

2018/11/18 23:13

はいそうです。 で、それは meshgrid() にパラメータ indexing='xy' (default) を設定した場合の仕様で、 indexing='ij' を設定した際は逆にならない。 です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問