NumPyの基本

NumPy

NumPyは数値計算を簡単に行うためのライブラリです。

特に強力なのが行列計算です。ディープラーニングの計算はほとんどが行列計算です。NumPyでは多次元の行列計算も簡単に行うことができます。

NumPyのインポート

NumPyは外部ライブラリです。そのため、初めにインポートする必要があります。 インポートするときは便宜上、次からnpと省略して使えるようにします。

import numpy as np

NumPy配列の作成

それでは、NumPy配列を作成したいと思います。 NumPy配列は以下のように作成します。比較のため普通のリストも作成しましょう。

np_array1 = np.array([1,2,3])
np_array2 = np.array([4,5,6])

array1 = [1,2,3]
array2 = [4,5,6]

型を見ると、それぞれの型が違うことがわかります。

print(type(np_array1)) #numpy.ndarray
print(type(array1)) #list

NumPy配列はshapeメソッドを使うことで、形を知ることができます。

np_array1 = np.array([[1,2,3],[4,5,6]])
np_array2 = np.array([[1,2],[3,4],[5,6]])
print(np_array1.shape) #(2, 3)
print(np_array2.shape) #(3, 2)

NumPyの加減乗除

NumPy配列の足し算について、見ていきたいと思います。 NumPy配列の足し算を以下のコードで行います。

print(np_array1+np_array2) #[5,7,9]
print(array1+array2) #[1,2,3,4,5,6]

結果から分かるように、NumPy配列の場合には2つの配列の要素ごとに足し算が行われ、要素数は変わりません。 それに対し、リストの足し算の場合には2つのリストの連結が行われています。

同様にかけ算についても、以下のように行います。

print(np_array1*np_array2) #[4,10,18]
print(array1*array2) #エラー

NumPy配列は各要素ごとのかけ算であったのに対し、リストではエラーとなります。 引き算、割り算も同様の結果になります。

NumPyの行列積

NumPyでは行列積の計算を簡単に行うことができます。 まずは、多次元配列を作成します。

np_array2_3 = np.array([[1,2],[3,4],[5,6]])
np_array3_2 = np.array([[1,2,3],[4,5,6]])

array2_3 = [[1,2],[3,4],[5,6]]
array3_2 = [[1,2,3],[4,5,6]]

リストを使っての行列積の計算の場合には、2×3の行列と3×2の行列をfor文のループを使って行い、2×2の行列を作成すると思います。

sum_array = [[0,0],[0,0]]
for i in range(len(array2_3)):
    for j in range(len(array2_3)):
        for k in range(len(array2_3[0])):
            sum_array[i][j] += (array2_3[i][k] * array3_2[k][j])
print(sum_array) #[[22, 28], [49, 64]]

NumPyを使うと、簡単に多次元配列の計算が可能です。 NumPyで作成した配列の場合には以下のようにできます。

print(np.dot(np_array2_3, np_array3_2)) #[[22, 28], [49 64]] 多少表記は異なる

NumPyのライブラリ

行列積の計算では、NumPyのdotというメソッドが使われました。NumPyには他にも便利なメソッドが多くあるので、後で使うものも含めて見ていきたいと思います。

三角関数

np_array = np.array([3.141,-3.141])
print(np.sin(np_array)) #[ 0.00059265 -0.00059265]
print(np.cos(np_array)) #[-0.99999982 -0.99999982]
print(np.tan(np_array)) #[-0.00059265  0.00059265]

指数関数

np_array = np.array([0, 1])
print(np.exp(np_array)) #[ 1.          2.71828183]

対数関数

np_array = np.array([1, 2.71828])
print(np.log(np_array)) #[ 0.          0.99999933]

最大値

np_array = np.array([-1,-2,1,2,0])
print(np.max(np_array)) #2
print(np.min(np_array)) #-2

NumPy配列の行ごと(列ごと)の合計

行を軸として合計をとる

np_array1 = np.array([[1,2,3],[4,5,6]])
np_array2 = np.array([[1,2],[3,4],[5,6]])
print(np.sum(np_array1, axis=0)) #[5 7 9]
print(np.sum(np_array2, axis=0)) #[ 9 12]

列を軸として合計をとる

np_array1 = np.array([[1,2,3],[4,5,6]])
np_array2 = np.array([[1,2],[3,4],[5,6]])
print(np.sum(np_array1, axis=1)) #[ 6 15]
print(np.sum(np_array2, axis=1)) #[ 3  7 11]

ランダム値の生成

x~yの範囲の中から1つ取り出す。np.random.uniform(x,y)

print(np.random.uniform(-3,3)) #-3~3の範囲の数字を出力
print(np.random.uniform(-3,3,[2,3])) #-3~3の範囲の数字を[2,3]で出力

0~xの範囲の中からy個取り出す。np.random.choice(x,y)

print(np.random.choice(10,5)) #0~10の範囲の数字を5個取り出した配列を出力

標準正規分布から値を取り出し、行数x,列数yの配列を作成する。np.random.randn(x,y)

print(np.random.randn(2,3)) #2×3の行列を出力

平均x,分散yに従う正規分布から値を1個取り出す。np.random.normal(x,y)

print(np.random.normal(50,10)) #平均50,分散10の正規分布に従う

コインを投げるという試行が、試行回数n,表の出る確率pとき、コインの表が出る確率は二項分布に従う。np.random.binomial(n,p)

print(np.random.binomial(n=100,p=0.3)) #試行回数50,確率0.3  nを増やすほど3割に近づく