みなさん、こんにちは!ぶたキムチです。
今回は、機械学習プログラミングで頻繁に使用されるNumpyの使い方について紹介していきます。Numpyの配列クラスには便利なメソッドが多く用意されているため、ディープラーニング実装においても頻繁に使用されます。
今日紹介するNumpyの使い方は、これからディープラーニング等でも使用されることが多いので、是非Numpyの使い方はマスターしておくといいでしょう。
1.Numpyのインポート
Numpyは外部ライブラリですので、importをしてあげましょう。
import numpy as np
asを伴うimport文の意味は、「numpyをas以降に表示しているnpとして読み込んでください。」です。
このように書いて、これ以降はnumpyに関するメソッドはnpとして参照することができます。
2.Numpy配列の算術計算
では、まずNumpyで配列を作って計算をしてみましょう。
a = np.array([1,2,3]) print(a, type(a)) #>>>[1 2 3] <class 'numpy.ndarray'> b =np.array([4,5,6]) print(b, type(b)) #>>>[4 5 6] <class 'numpy.ndarray'>
まず配列aと配列bを作成しました。それぞれのclassを調べてみると、numpy.ndarrayでnumpy配列を作成できていることがわかります。
次にnumpy配列の算術計算をしていきます。
#配列の演算 a + b #>>>array([5, 7, 9]) a * b #>>>array([ 4, 10, 18]) a / b #>>>array([0.25, 0.4 , 0.5 ]) a - b #>>>array([-3, -3, -3])
ここで注意するべき点は、配列aと配列bが同じ要素数ということです。両者とも要素数が3の1次元配列です。Numpyの算術計算は各要素に対して行われるため、要素数が異なる場合はエラーが出てしまいます。
ちなみに、単一の値(スカラー値)を用いて計算することもできます。これをブロードキャスト機能といい、後ほど説明します。
2.NumpyのN次元配列
Numpyは1次元配列だけでなく、多次元配列も作成することができます。
#Numpyの2次元配列 c = np.array([[1,2],[3,4]]) print(c) >>>[[1 2] [3 4]] #行列cの形状を知るためにはshapeを使用 c.shape >>>(2, 2) #行列cのデータ型を知るにはdtypeを使用 c.dtype >>>dtype('int64')
まず2×2の配列を作成しました。shape関数で配列の大きさを確認すると、(2,2)の配列になっていますね。また配列に入っている要素のデータ型も確認してみましょう。確認するには、dtype関数で調べることができます。
では同じく多次元配列の算術計算をみていきましょう。
#N次元配列の計算 d = np.array([[3,0],[0,6]]) #N次元配列の和 d + c >>>array([[ 4, 2], [ 3, 10]]) #N次元配列の積 d * c >>> array([[ 3, 0], [ 0, 24]])
まずc配列と同じ大きさのd配列作成しました。多次元配列の算術をみると、要素ごとに計算されていることがわかります。
3.ブロードキャスト
先ほど、Numpyでは配列の算術演算において、要素が異なる場合にはエラーが出てしまうとお伝えしました。しかし、Numpyには配列とスカラ値の計算を行う機能が備わっています。
まずは以下の配列の計算を実行してみましょう。
#行列に対してスカラ値で算術計算を行う場合 c * 10 >>>array([[10, 20], [30, 40]])
c配列に10というスカラ値 の掛け合わせを行いました。2×2配列に対して単一の数字で計算をする場合、スカラ値は2×2の配列に自身を拡大し計算を実行します。この機能をブロードキャスト(broadcast)と言います。
以下にブロードキャストのイメージを記載します。
※10が2×2の行列として扱われます。
ではブロードキャストの例を、もう一例見てみましょう。
orig = np.array([[1, 2],[3, 4]]) orig.shape >>>(2, 2) broad = np.array([10,20]) broad.shape >>>(2,) orig * broad array([[10, 40], [30, 80]])
orig配列はshape関数を使用すると2×2の配列、broad配列はshape関数を使用すると2×1 の配列となっています。この配列同士の積を計算すると、適宜配列を拡張してくれるブロードキャスト機能が働きます。
イメージはこんな感じ。
ではもう一例。
orig = np.array([3,4]) orig.shape broad = np.array([[4,6],[7,8]]) broad.shape broad + orig >>>array([[ 7, 10], [10, 12]])
もうブロードキャスト機能については理解できましたかね。ここで注目してほしいことは、配列を拡張し大きさを合わせる際には、行方向への拡張がされていることがわかります。
4.配列の要素へアクセス
作成した配列にアクセスする方法を紹介します。
#各要素へのアクセス X = np.array([[20, 50], [14, 16], [0, 4]]) print(X) >>>[[20 50] [14 16] [ 0 4]] X[0]#0行目へのアクセス >>>array([20, 50]) X[0][1]#(0,1)の要素へのアクセス >>>50
要素のアクセスは0から始まります。ちなみに、for文を使用して要素にアクセス可能です。
for i in X: print(i)
またNumpyは配列によって各要素にアクセスすることも可能です。
X = X.flatten() print(X) >>>[20 50 14 16 0 4] X[np.array([0,2,4])] >>>array([20, 14, 0])
flatten関数は、配列を1次元配列にする関数です。そして np.array([0,2,4])という配列で、X配列の0、2、4番目の要素にアクセスをします。
次に、条件を満たす要素にアクセスすることもできます。
X > 15 >>>array([ True, True, False, True, False, False]) X[X>15] >>>array([20, 50, 16])
5.様々な配列を作ってみる
arange()を使用する
Y = np.arange(10)#0から10個の要素を順に作成 print(Y) >>>[0 1 2 3 4 5 6 7 8 9] y = np.arange(0,20,2)#0~20の間を2ずつで表示 print(y) >>>[ 0 2 4 6 8 10 12 14 16 18]
linspace()関数を使用
#linespace関数を使用する(0~100を20等分する) Z = np.linspace(0,100,20) >>>[ 0. 5.26315789 10.52631579 15.78947368 21.05263158 26.31578947 31.57894737 36.84210526 42.10526316 47.36842105 52.63157895 57.89473684 63.15789474 68.42105263 73.68421053 78.94736842 84.21052632 89.47368421 94.73684211 100. ]
random関数を使用して乱数発生
#乱数を発生させる r = np.random.rand()#0~1までの中で乱数を返す print(r) >>>0.04609030530102731 R = np.random.randn()#正規分布に従った値を返し乱数を発生 print(R) >>>-1.07644419545427 #任意の乱数は単一値だけでなく、配列を指定することも可能 rn = np.random.rand(2,4) print(rn) >>>[[0.78336197 0.02619199 0.12790229 0.57707446] [0.17863759 0.55083388 0.14256553 0.8482031 ]]
reshape()関数で配列のサイズを変更
#reshapeで配列のサイズを変える #まず4次元配列を作成する w = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) w.shape >>>(4,3) wr = w.reshape(3,4) print(wr) >>>[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]
※reshapeは便利なので覚えておくと便利です。
またtranspose関数を使用すると配列の転置をすることができます。
w.transposeでもw.Tでもどちらでもいい実行可能です。
#transpose関数を使用して転置をする wt = w.T print(wt) >>>[[ 1 4 7 10] [ 2 5 8 11] [ 3 6 9 12]]
6.最後に
今回、紹介した内容はこの参考書を使用しました。お金の余裕がある方は実際に買って読破するのもありです。ネットでも十分ですが。
・ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
少し長くなってしまいましたが、Numpyの使い方を紹介しました。機械学習プログラミングが盛んになってきているので、Numpyはスラスラと使うことができるようにマスターしておくべきです。
どんどん、練習して使いこなせるようになりましよう。
最後まで見てくれてありがとうございます。
コメント