Pythonの勧め(2)NumPyについて

lecture

NumPy(ナムパイ)とはPythonの外部ライブラリです。これをインポートすることで配列や行列での計算で便利なメソッドを利用することができます。Deep Learningでもこれらのメソッドは使われます。今回はNumPyの使い方を学習します。
普通にリストなどを使用したら良さそうですが、複雑な行列の計算など計算スピードが早くなるような設計がされていたり、便利なメソッドも多いことがメリットです。

尚、ここでのサンプルの結果はJupyter Notebookに表示される結果です。

NumPyを使うにはライブラリ(モジュール)をimportする必要があります。

スポンサーリンク

numpyのimport方法

numpyを読み込むにはimport文を使います。 その後の「as」は別名を付けるもので一般的に略称になるような名前を付けます。

import numpy as np

numpyをimportすることで、NumPyの便利なメソッドを使うことができるようになります。

NumPy配列を作成

ベクトルとは向きと長さを表現したもので、速度などを表現する場合に使われます。
数学的には、2次元の場合、xとyで方向を示して、長さは で表します。
これはつまりxとyの値がわかればピタゴラスの定理を使って長さを求めることができるわけです。

ピタゴラスの定理は、左の図のような直角三角形の3つの辺の長さ(量)について

が成り立つというものです。

NumPy配列はnp.array() 関数で作成できます。型を調べると「numpy.ndarray」で示されます。

NumPy配列は数学の概念で言えば、1次元の場合はベクトル、2次元の場合は行列、3次元以上の場合はテンソルにあたります。

Jupyter Notebookで下記のサンプルを試してみましょう。
次のサンプルは通常のリストを作成して、それをNumPy配列を作成しています。
その後、type()で型を確認しています。

my_list1 = [1,2,3,4,5]
result = np.array(my_list1)
print(result)
type(result)

結果
[1 2 3 4 5]
numpy.ndarray

NumPy配列の演算

NumPy配列は計算を行えます。それぞれの要素に簡単に四則演算を行うことができます。
これは2次元のベクトルの足し算や定数倍を行なっています。
参考:線形代数の基礎 第2回 – ベクトル(1)

NumPy配列を作成

import numpy as np
my_arr = np.array([[1,2,3,4],[8,9,10,11]])

加算の例

my_arr+my_arr

結果
array([[ 2, 4, 6, 8],
[16, 18, 20, 22]])

減算の例

my_arr-my_arr

結果
array([[0, 0, 0, 0],
[0, 0, 0, 0]])

掛け算の例
スカラーを掛けた場合

2 * my_arr

結果
array([[ 2, 4, 6, 8],
[16, 18, 20, 22]])

配列同士を掛けた場合

my_arr = np.array([[1,2,3,4],[8,9,10,11]])
my_arr*my_arr

結果
array([[ 1, 4, 9, 16],
[ 64, 81, 100, 121]])

行列の積

行列の積の計算は少し面倒です。公式は次のようになります。

この計算もnumpyを使うと簡単に行えます。
nampyでは、numpy.dot()を使って行列同士の積算を行うことができます。

行列の積算例

d = np.array([[0,1],[3,4]])
e = np.array([[1,1],[1,1]])
v = np.array([1,0])
np.dot(d,e)

結果
array([[1, 1],
[7, 7]])

積算の順番を帰ると答えは違ってきます。

np.dot(e,d)

結果
array([[3, 5],
[3, 5]])

ベクトルと行列の積算例

np.dot(d,v)

結果
array([0, 3])

np.dot(e,v)

結果
array([1, 1])

行列A の列数と 行列B の行数が一致しないと積算ができません。
エラーがでる例

w = np.array([1,0,2])
np.dot(d,w)

結果
—————————————————————————
ValueError Traceback (most recent call last)
in ()
—-> 1 np.dot(d,w)

ValueError: shapes (2,2) and (3,) not aligned: 2 (dim 1) != 3 (dim 0)

インデックスを使って要素を取り出す方法

この方法はリストの要素を取り出す方法と同じです。

import numpy as np
arr = np.arange(0,11)
arr
arr[5]

結果
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
5

import numpy as np
arr = np.arange(0,11)
arr[1:4]

結果
array([1, 2, 3])

2次元配列の例

import numpy as np
arr_2d = np.array([[2,4,6],[1,3,5],[0,10,20]])
arr_2d
arr_2d[1][2]
#次の書き方でも同様になる
#arr_2d[1,2]

結果
array([[ 2, 4, 6],
[ 1, 3, 5],
[ 0, 10, 20]])
5

import numpy as np
arr_2d = np.array([[2,4,6],[1,3,5],[0,10,20]])
arr_2d[:2,1:]

結果
array([[4, 6],
[3, 5]])

行と列の入れ替え

行と列を入れ替えるには「T」を使います。

import numpy as np
arr = np.arange(9).reshape((3,3)
arr

結果
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])

Tを使って行と列を入れ替える例

import numpy as np
arr = np.arange(9).reshape((3,3)
arr.T

結果
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])

transpose()を使っても上と同様の結果を得られます。

import numpy as np
arr = np.arange(9).reshape((3,3)
arr.transpose()

結果
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])

transpose()の引数は次のように使います。
arr.transpose((0,1))とすると行と列は入れ替わりません。
arr.transpose((1,0))とすると行と列が入れ替わります。

Matplotlibでグラフを描画

機械学習を行うにはグラフが有効に活用できます。
Matplotlibはグラフ描画のためのライブラリです。matplotlibをimportするだけで簡単にグラフ描画ができますので使い方を覚えましょう。
次の例はnumpyとmatplotlibのpyplotというモジュールを利用したものです。
arange()で-5から15まで0.1ステップで配列を作成して、yの値は 2 * x + 1で算出しています。
その結果をグラフ化したものです。

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-5,15,0.1)
y = 2 * x + 1
plt.plot(x,y)
plt.show()

次のサンプルはxに配列を代入するまでは上と同じものです。
y_2を算出する計算式を2次関数に変更したものです。

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-5,15,0.1)
y_2 = x**2 - 10*x + 10
plt.plot(x,y_2)
plt.show()

次のサンプルはxに配列を代入するまでは上と同じものです。
y_3を算出する計算式を3次関数に変更したものです。

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-5,15,0.1)
y_3 = x**3 -10*x**2 - 10*x + 10
plt.plot(x,y_3)
plt.show()

参考資料:python/numpy

numpyを本気で学習するには、numpy-100 を試して見ると良いです。

タイトルとURLをコピーしました