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の値がわかればピタゴラスの定理を使って長さを求めることができるわけです。
NumPy配列はnp.array() 関数で作成できます。型を調べると「numpy.ndarray」で示されます。
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)
—-> 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 を試して見ると良いです。
コメントを投稿するにはログインしてください。