【Python・機械学習初心者向け】Numpyチュートリアル

Python
スポンサーリンク

みなさん、こんにちは!ぶたキムチです。

今回は、機械学習プログラミングで頻繁に使用される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.最後に

今回、紹介した内容はこの参考書を使用しました。お金の余裕がある方は実際に買って読破するのもありです。ネットでも十分ですが。

入門 Python 3

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

少し長くなってしまいましたが、Numpyの使い方を紹介しました。機械学習プログラミングが盛んになってきているので、Numpyはスラスラと使うことができるようにマスターしておくべきです。

どんどん、練習して使いこなせるようになりましよう。

最後まで見てくれてありがとうございます。

コメント

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