初心者のためのpython入門

自分がつまづいたところやつまづきやすいところを中心に書いていきます。また、役に立つライブラリの紹介などをしていきます。

Numpy[2]

前書き

前回の続きからで、今回もNumpyに関して説明していきます。特に、行列の演算について説明していきます。

配列の操作

ndarray.reshape(): 引数に与えられた次元の配列にする。引数に-1を指定すると1次元配列にすることができる。

>>> import numpy as np # ライブラリのインポート
>>> a = np.arange(12)
>>> a.reshape(3, 4) # 3行4列
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> a.reshape(2, 6) # 2行6列
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
>>> b = np.arange(12).reshape(4, 3) # 4行3列
>>> b
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
>>> b.reshape(-1) # 1次元配列
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> b.reshape(1, 12) # 1次元配列
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])

基本演算

同じ次元の配列において加減乗除ができます。

>>> a = np.arange(9).reshape(3, 3)
>>> b = np.arange(9).reshape(3, 3)
>>> a + b
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
>>> a * b
array([[ 0,  1,  4],
       [ 9, 16, 25],
       [36, 49, 64]])

ブロードキャスト

ブロードキャストを利用した演算が可能です。ブロードキャストとは、ndimやshapeが異なる(次元が異なる)入力配列間で、これらの属性を自動的に統一する機能です。ndimとshapeを統一することで、入力配列間で要素の演算が可能になります。全てのものに適用できるわけではありません。1番良く使うのは1次元と多次元の演算だと思います。なので、まずはこれをしっかりと理解しましょう。

>>> a = np.arange(9).reshape(3, 3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a + 1 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> a - 2
array([[-2, -1,  0],
       [ 1,  2,  3],
       [ 4,  5,  6]])
>>> a * 3
array([[ 0,  3,  6],
       [ 9, 12, 15],
       [18, 21, 24]])
>>> a / 4
array([[ 0.  ,  0.25,  0.5 ],
       [ 0.75,  1.  ,  1.25],
       [ 1.5 ,  1.75,  2.  ]])
>>> a ** 2
array([[ 0,  1,  4],
       [ 9, 16, 25],
       [36, 49, 64]])
>>> a < 5
array([[ True,  True,  True],
       [ True,  True, False],
       [False, False, False]], dtype=bool)

今回の例では、演算子の右側の1次元の要素が3行3列の次元に拡張されて計算されています。

メソッドを使った演算

A,Bをndarray型とします。 - A.dot(B): A行列とB行列のドット積を計算します。(np.dot(A, B)でも同じ。) - A.sum(axis): Aの要素の合計を求めます。axis(軸)を指定することにより行や列ごとに求めることも可能。 - A.min(axis): Aの要素の最小値を求めます。 - A.max(axis): Aの要素の最大値を求めます。 - A.cumsum(axis): Aの要素の累積和を求めます。 - np.linalg.inv(A): Aの逆行列を求めます。

>>> a = np.arange(4).reshape(2, 2)
>>> b = np.arange(4).reshape(2, 2)
>>> a
array([[0, 1],
       [2, 3]])
>>> b
array([[0, 1],
       [2, 3]])

# ドット積
>>> a.dot(b)
array([[ 2,  3],
       [ 6, 11]])

# 合計
>>> a.sum()
6

# 最小値
>>> a.min(axis=0) # 行を指定
array([0, 1])

# 最大値
>>> a.max(axis=1) # 列を指定
array([1, 3])

# 累積和
>>> a.cumsum()
array([0, 1, 3, 6])

# 逆行列
>>> a = a + 1 # 今回の行列では、1を足さないと逆行列が存在せず、例外が発生する。
>>> np.linalg.inv(a)
array([[  3.15251974e+15,  -6.30503948e+15,   3.15251974e+15],
       [ -6.30503948e+15,   1.26100790e+16,  -6.30503948e+15],
       [  3.15251974e+15,  -6.30503948e+15,   3.15251974e+15]])

最後に

お疲れ様でした。numpyの基本的な使い方はだいたい終わりです。次回は、numpyのその他の関数を紹介とmatplotlibライブラリの使用ほうについて説明したいと思います。matplotlibはグラフ作成のライブラリです。