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はグラフ作成のライブラリです。