機械学習を実装するには、行列やベクトルを扱う必要があります。行列、ベクトルだけでなく平均や標準偏差を計算することも多々あります。
しかし、、わざわざそれらをプログラムするのは非常に面倒です!
そこで、pythonではnumpyというライブラリを用います。
numpyとは、pythonでの数値計算を簡易化するために開発されたライブラリです。
このページでは、numpyについて取り上げ、具体的な使い方を見ていきます。
- numpyの簡単な作成方法、numpyからlistへの変換(np.array, np.arange, tolist)
- 0行列、1行列、単位行列(zeros, ones, eye)
- 分割して作成した配列の作成(linspace)
- 行列の形の変換(reshape)
- 行列のランダム値、正規分布(rand, randn, randint)
numpyの簡単な作成方法、numpyからlistへの変換(np.array, np.arange, tolst)
以下に簡単なnumpyの作成方法を示します。
- pythonのlistからnumpyの行列へ(np.array, np.arange)
- numpyの行列からpythonのlistへ(numpy.ndarray.tolist)
# numpyの初期化方法 my_list = np.array([1, 2, 3]) # 行列の作成 # class 'numpy.ndarray' array([1, 2, 3]) my_mat = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 行列の作成 # class 'numpy.ndarray' array([[1, 2, 3], [4, 5, 6], [7, 8, 9) np.arange(0, 11, 2) # 1つとばしの0-10までの列 # class 'numpy.ndarray' array([0, 2, 4, 6, 8, 10] ) ## numpyからpythonのlistへの変換(tolist) ## my_mat.tolist() # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
0行列、1行列、単位行列(zeros, ones, eye)
numpyを用いると色んな行列を簡単に作ることができます。
ここでは代表的なものとして0行列、1行列、単位行列を上げさせて頂きます。
0行列とは、値が全て0の行列です。
これには、np.zerosを用います。
1行列は、値が全て1の行列です。
これには、np.onesを用います。
単位行列とは、行と列の等しい部分は1、それ以外は0の行列です。
これには、np.eyeを用います。
↓のような行列
[1, 0, 0]
[0, 1, 0]
[0, 0, 1]
# 0行列(np.zeros), 1の行列(np.ones), 単位行列(np.eye)の実装 print(np.zeros(3)) # [0, 0, 0] print(np.zeros((3, 3))) # [[0, 0, 0] # [0, 0, 0] # [0, 0, 0]] print(np.ones(3)) # [1, 1, 1] print(np.ones((3, 3))) # [[1, 1, 1] # [1, 1, 1] # [1, 1, 1]] print(np.eye(3)) # [[1, 0, 0] # [0, 1, 0] # [0, 0, 1]]
分割して作成した配列の作成(linspace)
np.linspaceを用いるとある範囲でいくらかに分割して配列を作成することができます。
たとえば
np.linspace(0, 5, 4)とすると0 ~ 5までで4分割され以下のように出力されます
array([0. , 1.66666667, 3.33333333, 5. ])
行列の形の変換(reshape)
次に行列の形を変換する方法について記載します。
つまり、
(6, 1) の行列を (2, 3)の形にするなどです。
これをするには、reshape関数を使います。
実際に見て見ましょう
# 行列の形(行数と列数)の変更 np.arange(0,6) # array([0, 1, 2, 3, 4, 5]) np.arange(0,6).reshape(2, 3) # 行列の形を1行6列から2行3列に変更 #array([[0, 1, 2], # [3, 4, 5]]) # ちなみに行数*列数のサイズが同じでないとエラーになります。 np.arange(0,5).reshape(2, 3) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ValueError: cannot reshape array of size 5 into shape (2,3)
次に行列のランダム値、正規分布の作成をしましょう。
これは、機械学習の際に値を初期化するのに必要になります。
ランダム値の作成には、
np.ramdom.rand(行数, 列数)を使います。これをすると0~1の範囲でのランダム値が指定した行数、列数の行列として作成されます。
正規分布に従ったランダム値の表示には、
np.random.randn(行数, 列数)とします。
すると、平均0, 分散1である標準正規分布の行列が作成されます。
最後に、整数のランダム値を生成したい場合ですが、
これには、np.random.randint(n, m, (行数, 列数))
するとn~m-1の間の整数が指定した行数と列数の行列として作成されます。
実際に例を見ましょぅ
# rand, randn, randintを用いたランダム値行列の作成 ## rand ######################### np.random.rand(5) [0.47613209 0.17554651 0.52637641 0.29382056 0.76435774] # 1行5列の0~1までのランダム値行列 np.random.rand(5,5) # 5行5列の0~1までのランダム値行列 # [[0.61883284 0.75824608 0.41693386 0.15827934 0.40941596] # [0.38359948 0.60788297 0.61990985 0.79745707 0.21668662] # [0.04532364 0.67372592 0.56545386 0.22726293 0.30243403] # [0.13251716 0.55645034 0.41324027 0.93183949 0.24394547] # [0.35270749 0.23896005 0.57328702 0.08253975 0.99966318]] ## randn ######################### np.random.randn(5) # 1行5列の標準正規分布 # array([-0.27892323, 0.26257052, -0.48060383, -0.33141197, 2.51216024]) np.random.randn(3, 3) # 3行3列の標準正規分布 # array([[-0.48518996, 0.93988438, 1.57549951], # [ 0.37045346, 0.83672192, -1.15928442], # [ 0.71979199, -1.69430231, -0.72214307]]) ## randint ######################### np.random.randint(-5, 5, 5) # -5~4までの整数のランダム値の1行5列の行列 # array([-5, -5, 1, 1, 3]) np.random.randint(-5, 5, (3, 3)) # -5~4までの整数のランダム値の3行3列の行列 # array([[-4, -1, -1], # [ 0, -2, -4], # [ 3, 1, -5]])