Numpyの基本
『深層学習の教科書(翔泳社)』と、『機械学習のエッセンス(加藤公一著)』を元に自分用のNumpyの基本を制作しました。コードのほとんどは本から引用しております。
Numpyって何?
Numpyとは、簡単に言えば「Pythonの計算を高速に行ってくれるもの」です!
「ナンパイ」または「ナムパイ」と呼ばれます。
「高速の行ってくれるもの」といいましたが、正確には『ライブラリ』と呼ばれるものです。
『ライブラリ』とは、『役に立つコードの塊』と思ったら良いです。
Numpyは他のライブラリの根底に関係する重要な役割を持っています。
Numpyを使おう!
以下の様にする事で、numpyの準備が全て完了します
import numpy as np
as npというものはパッケージ名を「np」にしたよ、という意味です。
Numpy1次元配列
Numpyの関数
Numpyを用いることで、日常生活で使う数学の関数を使うことができるようになります。
以下はその例です。
ユニバーサル関数
import numpy as np
np.exp(1) #eのべき乗
np.log(np.e) #自然対数
np.sin(np.pi) #正弦
np.sqrt(2) #平方根(ルート)
np.abs(-1) #絶対値
統計関数
import numpy as np
arr = np.arrange(15).reshape(3, 5)
arr.mean(axis=0) #列ごとの平均
arr.sum(axis=1) #行の合計
arr.min() #arrの最小値
arr.argmax(axis=0) #それぞれの列の最大値のインデックス番号
Numpyにおける配列
いつものPythonのようにNumpyにも配列が存在します。(ndarrayといいます)
以下の様にして、配列を作成できます。
np.array(リスト)
np.array([0,1,2,3,4,5,6,7,8,9])
上記でも数字の配列を作成できますが、次のようにしても同様の意味になります。
np.arange(10)
Numpy配列のスライス
次のようにして行います。
arr[start:end] = 変更したい値
abc = np.arange(10)
abc[0:5] = 0 #1個目から5個目までを0に変えています
print(abc) #出力結果「[0 0 0 0 0 5 6 7 8 9]」
Numpy配列の注意
Numpy配列は代入先の値を変更すると、元の値も変更されてしまいます。それでは困るので以下のように、copy()メソッドを使います。
コピーしたい配列.copy()
import numpy as np
a = np.array([0,1,2,3,4,5,6,7])
# コピーします
b = a.copy()
# 配列の要素を変えてみて、元の要素が変更されていないか確認します
b[0] = 7
print(a)
print(b)
ブールインデックス参照
ブールインデックス参照とは、[]の中にTrueかFalseの配列を用いて要素を取り出す方法です。
以下の様にして、Trueに該当する箇所のNumpy配列を作成して返してくれます。
arr[ndarrayの論理値の配列]
arr = np.array([2, 4, 6, 7])
print(arr[np.array([True, True, True, False])])
集合関数
集合関数は、1次元配列のみを対象とし、数学の集合演算を行う関数です。
・重複を取り除きソートした結果を返す
np.unique()
・少なくとも一方に存在する要素を取り出しソートする(和集合)
np.union1d(x, y)
・共通する要素を取り出しソートする(積集合)
np.intersect1d(x, y)
・共通する要素を取り除きソートする(差集合)
np.setdiff1d(x, y)
乱数を扱う
乱数を扱うには基本的にnumpy.randint()を使いますが、次のように記述しておくと楽になります。
from numpy.random import randint
・0以上1未満の乱数を生成する
np.random.rand()
()の中に入れた整数の数だけ乱数が生成されます。
・x以上y未満の整数をz個生成する
randint(x, y, z)
さらに、zには(2,3)などの引数もいれることができ、それによって2×3の行列を生成できます。
import numpy as np
from numpy.random import randint
# arr1に0以上10以内の整数の行列(5×2)を代入する
arr1 = randint(0, 11, (5,2))
print( arr1 )
# arr2に0以上1未満の乱数を3つ代入する
arr2 = np.random.rand(3)
print( arr2 )
二次元配列
二次元行配列は行列に該当する。
np.array([リスト,リスト])
とすることで、二次元配列を作成することができる
二次元配列の操作
・各次元ごとの要素数を返す
ndarray配列.shape
・指定した引数と同じ形の行列に変換する
ndarray配列.reshape(a,b)
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8]])
print( arr )
# arrの形状を表示する
print( arr.shape )
# arrを4行2列の行列に変換する
print(arr.reshape(4,2))
axisについて
二次元配列からはaxisという概念が重要になってきます。
列ごとに処理を行う:axis=0
行ごとに処理を行う:axis=1
# 要素を足し合わせる
arr = np.array([[1,2,3],[4,5,6]])
print(arr.sum()) #要素をすべて足し合わせる
print(arr.sum(axis=0)) #列を足し合わせる
print(arr.sum(axis=1)) #行を足し合わせる
ファンシーインデックス参照
ndarray配列からある特定の順序で行を抽出する
arr = np.array([[1,2],[3,4],[5,6],[7,8]])
print(arr[[3,2,0]]) #インデックス番号で記述する
# 出力結果
# [[7 8]
# [5 6]
# [1 2]]
行列の転置
行と列を入れ替える(転置といいます)
np.transpose(arr) もしくは
arr.T
で実行することができます。
ソート
argsort()メソッドについて
①要素の数字が大きい順に前から並べる
②インデックス番号を返す
arr = np.array([15,30,5])
arr.argsort()
# 出力結果
# array([2, 0, 1])
行列計算
・二つの行列積を返す
np.dot(a,b)関数
・ノルムを返す
np.linalg.norm(変数(ベクトル))関数
import numpy as np
arr = np.arange(9).reshape(3,3)
# arrとarrの行列積を出力
print( np.dot(arr, arr) )
# vecを定義します
vec = arr.reshape(9)
# ノルムを出力する
print( np.linalg.norm(vec) )