特殊なNumPy配列の生成方法

ここでは特殊な行列やその他の特殊なndarray配列の生成方法を説明する。

単位行列 np.eye, np.identity

np.eye または np.identity は単位行列を2次元配列で生成する。この2つの使い方は同じ。要素の型は浮動小数点数になる。

npdata = np.eye(5)
print(npdata)
# 出力結果
# [[ 1.  0.  0.  0.  0.]
#  [ 0.  1.  0.  0.  0.]
#  [ 0.  0.  1.  0.  0.]
#  [ 0.  0.  0.  1.  0.]
#  [ 0.  0.  0.  0.  1.]]

numpy.eye | NumPy v1.9 Manual
http://docs.scipy.org/doc/numpy/reference/generated/numpy.eye.html

numpy.identity | NumPy v1.9 Manual
http://docs.scipy.org/doc/numpy/reference/generated/numpy.identity.html

np.meshgrid

2次元座標空間の中にある24個の点 (0.0, 0.0), (0.5, 0.0), (1.0, 0.0), (1.5. 0.0), (0.0, 0.5), (0.5, 0.5), (1.0, 0.5), (1.5. 0.5), … (0.0, 2.5), (0.5, 2.5), (1.0, 2.5), (1.5. 2.5) は、横(x軸方向)に4個、縦(y軸方向)に6個の格子状に並んでいるが、これをNumPyではx座標、y座標それぞれを抜き出して、

[[ 0.   0.5  1.   1.5]
 [ 0.   0.5  1.   1.5]
 [ 0.   0.5  1.   1.5]
 [ 0.   0.5  1.   1.5]
 [ 0.   0.5  1.   1.5]
 [ 0.   0.5  1.   1.5]]

[[ 0.   0.   0.   0. ]
 [ 0.5  0.5  0.5  0.5]
 [ 1.   1.   1.   1. ]
 [ 1.5  1.5  1.5  1.5]
 [ 2.   2.   2.   2. ]
 [ 2.5  2.5  2.5  2.5]]

の2つのndarrayで表すことがよくある。

この配列は以下のようにして生成できる。

npdata1a = np.arange(0, 2.0, 0.5)
print(npdata1a)
# 出力結果
# [ 0.   0.5  1.   1.5]

npdata1b = np.arange(0, 3.0, 0.5)
print(npdata1b)
# 出力結果
# [ 0.   0.5  1.   1.5  2.   2.5]

npdata2a, npdata2b = np.meshgrid(npdata1a, npdata1b)
print(npdata2a)
# 出力結果
# [[ 0.   0.5  1.   1.5]
#  [ 0.   0.5  1.   1.5]
#  [ 0.   0.5  1.   1.5]
#  [ 0.   0.5  1.   1.5]
#  [ 0.   0.5  1.   1.5]
#  [ 0.   0.5  1.   1.5]]

print(npdata2b)
# 出力結果
# [[ 0.   0.   0.   0. ]
#  [ 0.5  0.5  0.5  0.5]
#  [ 1.   1.   1.   1. ]
#  [ 1.5  1.5  1.5  1.5]
#  [ 2.   2.   2.   2. ]
#  [ 2.5  2.5  2.5  2.5]]

こういう形の配列にするとなにがうれしいのかというと、ndarrayのベクトル計算ユニバーサル関数を使いやすくなるのである。

以下は、24個の点についてそれぞれ原点からの距離を計算したものである。

print(np.sqrt(npdata2a ** 2 + npdata2b ** 2))
# 出力結果
# [[ 0.          0.5         1.          1.5       ]
#  [ 0.5         0.70710678  1.11803399  1.58113883]
#  [ 1.          1.11803399  1.41421356  1.80277564]
#  [ 1.5         1.58113883  1.80277564  2.12132034]
#  [ 2.          2.06155281  2.23606798  2.5       ]
#  [ 2.5         2.54950976  2.6925824   2.91547595]]

グラフも書きやすい。

import matplotlib
matplotlib.use('Agg')

import matplotlib.pyplot as plt

x, y = np.meshgrid(np.arange(-3.0, 3.1, 0.1), np.arange(-3.0, 3.1, 0.1))
plt.imshow(np.sqrt(x ** 2 + y ** 2))
plt.colorbar()
plt.savefig('example.png', transparent=True, dpi=80)

IPython Notbookでは上のコードの最初に2行と最後の1行は不要。

fig

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。