Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

NumPy:格子と乱数

2次元格子の生成と乱数をまとめる. パラメトリック曲面(P2-01)や,2次元の場・初期値の設定(P2-03)で用いる.

import numpy as np

meshgrid(2次元格子)

np.meshgrid は,2本の1次元配列から平面上の格子点の座標を作る. パラメトリック曲面(P2-01)や2次元の場(P2-03)を扱うときに不可欠である.

x = np.linspace(0, 1, 3)
y = np.linspace(2, 3, 4)
xmesh, ymesh = np.meshgrid(x, y)

print("xmesh:\n", xmesh)
print("ymesh:\n", ymesh)
print("形状:", xmesh.shape)  # (len(y), len(x))
xmesh:
 [[0.  0.5 1. ]
 [0.  0.5 1. ]
 [0.  0.5 1. ]
 [0.  0.5 1. ]]
ymesh:
 [[2.         2.         2.        ]
 [2.33333333 2.33333333 2.33333333]
 [2.66666667 2.66666667 2.66666667]
 [3.         3.         3.        ]]
形状: (4, 3)

xmeshymesh の同じ位置を組にすると,すべての格子点 (x, y) を表す.これらをまとめて関数に渡せば,格子全体の値を一度に計算できる.

import matplotlib.pyplot as plt

plt.figure()
plt.gca().set_aspect("equal")
plt.scatter(xmesh, ymesh)
plt.title("grid points from meshgrid")
plt.show()
<Figure size 640x480 with 1 Axes>

乱数

np.random は擬似乱数を生成する.default_rng で乱数生成器を作る方法が推奨される. シード (seed)を固定すると,毎回同じ乱数列が得られ結果を再現できる.

rng = np.random.default_rng(seed=0)

# 一様乱数(0 以上 1 未満)
print("一様乱数:\n", rng.uniform(0, 1, size=(2, 3)))

# 整数の乱数(0 または 1)
print("0/1 乱数:\n", rng.integers(0, 2, size=(3, 3)))

# 正規乱数(平均 0,標準偏差 1)
print("正規乱数:", rng.normal(0, 1, size=4))
一様乱数:
 [[0.63696169 0.26978671 0.04097352]
 [0.01652764 0.81327024 0.91275558]]
0/1 乱数:
 [[1 1 1]
 [1 1 1]
 [1 1 0]]
正規乱数: [ 0.04132598 -2.32503077 -0.21879166 -1.24591095]

反応拡散モデル(P2-03)では,一様な初期状態にわずかな乱数を加えて対称性を破り,パターンを発生させる.

u = np.ones((4, 4))
u = u + rng.uniform(0, 0.01, size=u.shape)
print("わずかな揺らぎを加えた初期場:\n", u)
わずかな揺らぎを加えた初期場:
 [[1.00175656 1.00863179 1.00541461 1.00299712]
 [1.00422687 1.0002832  1.00124283 1.00670624]
 [1.0064719  1.00615385 1.00383678 1.0099721 ]
 [1.00980835 1.00685542 1.00650459 1.00688447]]