記事の概要
第2回は数値計算ライブラリであるNumpyについてまとめます。
Numpy
Numpyは数値計算ライブラリであり、リストや行列の計算を簡単に実現できる。
また、そのリストや行列の内容から統計量を簡単に取得できる。
Numpy arrayの生成
リストからNumpy arrayを生成するには、arrayメソッドを使用する。
CSVファイルからNumpy arrayを生成するには、genfromtxtメソッドを使用し、delimiterを指定する。
Pythonのrangeメソッドと同じように数列を生成するには、arangeメソッドを使用する。
my_array = np.array([1, 2, 3, 4, 5, 6])
csv_array = np.genfromtxt('sample.csv', delimiter=',')
range_array = np.arange(2, 12, 2)
生成したNumpy arrayの要素の選択やスライスは、通常のリストと同じように行える。
その他、全ての要素を指定値としたNumpy arrayを生成するfullメソッドなどがある。
Numpy arrayのLogical Operations
Numpy arrayのbracket内に条件式を入れると、その条件を満たした要素のみの新しいNumpy arrayを生成する。
a = np.array([10, 2, 2, 4, 5, 3, 9, 8, 9, 7])
print(a[a > 5])
[10 9 8 9 7]
実際の処理としては、「a > 5」がBoolean型のNumpy arrayを生成し、それがbracketに入ることで、Trueの要素だけを抽出している。
ブロードキャスト
Numpyにはブロードキャストと呼ばれる特徴があり、形状の異なるリスト・行列同士の計算が行われた場合は、サイズの小さい方を大きい方に合わせて計算する。
定数と行列の計算や、3x1ベクトルと3x4行列の計算など、何も考えずに演算子で結合するだけで実行できる。
統計量
Numpyでは以下のようにリストの要素に対する統計量を取得するメソッドが数多く存在する。
- mean : 平均値
- median : 中央値
- percentile : パーセンタイル(第2引数でパーセンテージを指定)
- std : 標準偏差
- var : 分散
- count : データの個数
特定条件を満たす要素の比率(meanメソッドの応用)
以下のようなコードにより、「ある条件を満たす要素数の全体に対する比率」を一発で取得できる。
a = np.array([10, 2, 2, 4, 5, 3, 9, 8, 9, 7])
print(np.mean(a > 8)) #3/10
0.3
2次元行列に対する統計量の計算
2次元行列に対して上記統計量取得メソッドを使用する際は、メソッドのaxisパラメータを指定することで、行方向または列方向への集約が可能。
axis=1の場合は行方向に、axis=0の場合は列方向に集約し、それぞれリストを出力する。指定しない場合は全体を集約して1つの値で出力する。
ring_toss = np.array([[1, 0, 0],
[0, 0, 1],
[1, 0, 1]])
print(np.mean(ring_toss)) #全体を集約
print(np.mean(ring_toss, axis=1)) #行方向に集約
print(np.mean(ring_toss, axis=0)) #列方向に集約
0.44444444444444442
[ 0.33333333 0.33333333 0.66666667]
[ 0.66666667 0. 0.66666667]
numpy.randomによる分布標本の生成
Numpyには、指定した分布に基づいたランダムな標本を自動で生成するメソッドがある。
- numpy.random.normal(平均, 標準偏差, size=サイズ) : 正規分布
- numpy.random.binomial(試行回数, 成功確率, size=サイズ) : 二項分布
randomを使用する際は、numpy.random.seed(シード値)でシード値を指定することで、乱数を固定にできる。
argmaxによる最大値をもつ要素のインデックス取得
特にKaggleの分類問題においてよく使われるメソッドに、最大値をもつ要素のインデックスを取得するargmaxがある。
results = np.argmax(predictions,axis = 1)
次回はScipyになる予定です。