NumPy
前回、Pythonのmatplotlibでpcolormeshを使って正規分布(ガウス分布)を2次元プロットする方法を紹介しました。
今回はNumPyで格子状の多次元配列を作成するmgrid関数、meshgrid関数を紹介します。
それでは始めていきましょう。
mgrid関数
mgrid関数は「np.mgrid[開始:終了:ステップ]」とすることで新たなリストを作成します。
import numpy as np
print(np.mgrid[0:3:1])
実行結果
[0 1 2]
これだとrange関数やNumPyのarange関数と変わらない様に見えますが、mgrid関数では「np.mgrid[開始1:終了1:ステップ1, 開始2:終了2:ステップ2]」とすることで格子状の2次元配列を作成することができます。
import numpy as np
print(np.mgrid[0:3:1, 0:4:1])
実行結果
[[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]]
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]]
2つの範囲を指定した場合、出力される格子状の配列は縦(行数)が1つ目の範囲の個数、横(列数)が2つ目の範囲の個数となります。
上記の例では1つ目の範囲は「0, 1, 2」の3つなので縦が3つ、2つ目の範囲が「0, 1, 2, 3」の4つなので横が4つの格子状の配列となります。
そのため範囲やステップを変えると配列の行、列の数も変化します。
import numpy as np
print(np.mgrid[0:3:1, 4:8:2])
実行結果
[[[0 0]
[1 1]
[2 2]]
[[4 6]
[4 6]
[4 6]]]
また3次元以上の格子状の配列を生成することもできます。
import numpy as np
print(np.mgrid[0:2:1, 0:3:1, 0:4:1])
実行結果
[[[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
[[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]]
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]]]
[[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]]]
この場合、2つ目の範囲の個数が行数、3つ目の範囲の個数が列数、そして1つ目の範囲が2つ目と3つ目の範囲により作成された2次元配列をまとめるグループ数になります。
言葉にするとなかなか分かりづらいので、色々といじってみて感覚を掴んでみてください。
mgrid関数は記述が簡単な点がメリットですが、等間隔の値しか使えないデメリットがあります。
meshgrid関数
似た様な関数にmeshgrid関数があり、こちらはリストを作成し、そのリストより格子状の多次元配列を作成します。
使い方は「np.meshgrid(a, b)」で、aのリストの要素数が列数、bの要素数が行数になります。
これは先ほどのmgrid関数とは逆なので注意してください
import numpy as np
x = [0, 1, 2]
y = [10, 11, 12, 13]
print(np.meshgrid(x, y))
実行結果
[array([[0, 1, 2],
[0, 1, 2],
[0, 1, 2],
[0, 1, 2]]), array([[10, 10, 10],
[11, 11, 11],
[12, 12, 12],
[13, 13, 13]])]
指定するのがリストであるため、値が等間隔である必要はなく、自由な値で多次元配列を作成することができます。
import numpy as np
x = [0, 5, 6]
y = [10, 13, 11, 20]
print(np.meshgrid(x, y))
実行結果
[array([[0, 5, 6],
[0, 5, 6],
[0, 5, 6],
[0, 5, 6]]), array([[10, 10, 10],
[13, 13, 13],
[11, 11, 11],
[20, 20, 20]])]
自由な値というのは数値だけでなく、文字列でもbool値(True/False)でも大丈夫です。
import numpy as np
x = ["a", "b", "c"]
y = ["d", "e", "f", "g"]
print(np.meshgrid(x, y))
実行結果
[array([['a', 'b', 'c'],
['a', 'b', 'c'],
['a', 'b', 'c'],
['a', 'b', 'c']], dtype='<U1'), array([['d', 'd', 'd'],
['e', 'e', 'e'],
['f', 'f', 'f'],
['g', 'g', 'g']], dtype='<U1')]
import numpy as np
x = [True, False, True]
y = [False, True, False, True]
print(np.meshgrid(x, y))
実行結果
[array([[ True, False, True],
[ True, False, True],
[ True, False, True],
[ True, False, True]]), array([[False, False, False],
[ True, True, True],
[False, False, False],
[ True, True, True]])]
もちろん3次元配列以上の多次元配列を作成することも可能です。
import numpy as np
x = [0, 1, 2]
y = [10, 11, 12, 13]
z = [21, 22]
print(np.meshgrid(x, y, z))
実行結果
[array([[[0, 0],
[1, 1],
[2, 2]],
[[0, 0],
[1, 1],
[2, 2]],
[[0, 0],
[1, 1],
[2, 2]],
[[0, 0],
[1, 1],
[2, 2]]]), array([[[10, 10],
[10, 10],
[10, 10]],
[[11, 11],
[11, 11],
[11, 11]],
[[12, 12],
[12, 12],
[12, 12]],
[[13, 13],
[13, 13],
[13, 13]]]), array([[[21, 22],
[21, 22],
[21, 22]],
[[21, 22],
[21, 22],
[21, 22]],
[[21, 22],
[21, 22],
[21, 22]],
[[21, 22],
[21, 22],
[21, 22]]])]
正直3次元以上の格子状の多次元配列を使う場面があるか分かりませんが、2次元の格子状の配列はいろんな場所で使えると思うので知っておいて損はないでしょう。
次回はNumPyで全ての要素が任意の値である配列を作成する方法を紹介します。
ではでは今回はこんな感じで。
コメント