静かなる名辞

pythonとプログラミングのこと



【python】np.meshgridの基本的な使い方まとめ

 meshgridはなんとなく苦手な感じなので、操作をまとめておく。

 目次

とりあえずmeshgirdを作ってみる

 meshgrid自体はこのように何の変哲もないものだ。

>>> import numpy as np
>>> a = np.arange(0,3,0.5)
>>> b = np.arange(0,10,2)
>>> a
array([0. , 0.5, 1. , 1.5, 2. , 2.5])
>>> b
array([0, 2, 4, 6, 8])
>>> X, Y = np.meshgrid(a, b)
>>> X
array([[0. , 0.5, 1. , 1.5, 2. , 2.5],
       [0. , 0.5, 1. , 1.5, 2. , 2.5],
       [0. , 0.5, 1. , 1.5, 2. , 2.5],
       [0. , 0.5, 1. , 1.5, 2. , 2.5],
       [0. , 0.5, 1. , 1.5, 2. , 2.5]])
>>> Y
array([[0, 0, 0, 0, 0, 0],
       [2, 2, 2, 2, 2, 2],
       [4, 4, 4, 4, 4, 4],
       [6, 6, 6, 6, 6, 6],
       [8, 8, 8, 8, 8, 8]])

 つまり(0,0)の値を(X[0,0],Y[0,0])として表現できる。ここまでは常識的な話。

計算する

 なぜかこのまま計算できる。

>>> Z = np.sin(X+Y)
>>> Z
array([[ 0.        ,  0.47942554,  0.84147098,  0.99749499,  0.90929743,
         0.59847214],
       [ 0.90929743,  0.59847214,  0.14112001, -0.35078323, -0.7568025 ,
        -0.97753012],
       [-0.7568025 , -0.97753012, -0.95892427, -0.70554033, -0.2794155 ,
         0.21511999],
       [-0.2794155 ,  0.21511999,  0.6569866 ,  0.93799998,  0.98935825,
         0.79848711],
       [ 0.98935825,  0.79848711,  0.41211849, -0.07515112, -0.54402111,
        -0.87969576]])

 ま、これはmeshgridの機能というより、numpyの機能。

plotしてみる

 ぶっちゃけ3Dのplot以外でmeshgrid使うことってあるんですか・・・?

>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.mplot3d import Axes3D
>>> fig = plt.figure()
>>> ax = Axes3D(fig)
>>> ax.plot_wireframe(X, Y, Z)
<mpl_toolkits.mplot3d.art3d.Line3DCollection object at 0x7f04d0367860>
>>> plt.show()

meshgridを使って三次元プロット
meshgridを使って三次元プロット

 謎の関数にしてしまったのでよくわからないが、とりあえずできている。

x,y,z座標の配列に変換する

 meshgridから座標の配列に変換する方法がずっとよくわからなかった。実は単にflattenするだけでよかったのだな・・・ravelを使ってみる。

>>> x = X.ravel()
>>> y = Y.ravel()
>>> z = Z.ravel()
>>> x.shape
(30,)
>>> y.shape
(30,)
>>> z.shape
(30,)
>>> x
array([0. , 0.5, 1. , 1.5, 2. , 2.5, 0. , 0.5, 1. , 1.5, 2. , 2.5, 0. ,
       0.5, 1. , 1.5, 2. , 2.5, 0. , 0.5, 1. , 1.5, 2. , 2.5, 0. , 0.5,
       1. , 1.5, 2. , 2.5])
>>> y
array([0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6,
       6, 6, 8, 8, 8, 8, 8, 8])
>>> z
array([ 0.        ,  0.47942554,  0.84147098,  0.99749499,  0.90929743,
        0.59847214,  0.90929743,  0.59847214,  0.14112001, -0.35078323,
       -0.7568025 , -0.97753012, -0.7568025 , -0.97753012, -0.95892427,
       -0.70554033, -0.2794155 ,  0.21511999, -0.2794155 ,  0.21511999,
        0.6569866 ,  0.93799998,  0.98935825,  0.79848711,  0.98935825,
        0.79848711,  0.41211849, -0.07515112, -0.54402111, -0.87969576])

 こうすると色々な関数に渡せそうで便利。

まとめ

 meshgridってやってることは単純なのに、なぜかちょっと難しい感じがするよね。でも改めて動かしてみたらちょっとは親近感が湧いたよ、というお話でした。