numpyとはpythonにおいて数値計算を行うことができるライブラリで、多次元配列や行列を簡単に計算出来るため、機械学習では必須テクニックとなります。
今回は、そのnumpyの基本的なテクニックをメモしておきます。
#numpyの基本テクニック
##import
import numpy as np
##基本的な配列の生成
配列の生成には、np.array()メソッドを使う。
- 1*3の配列
np.array([1,2,3])
- 3*3の配列
np.array([[1,2,3],[4,5,6],[7,8,9]])
##形状の確認
配列の形状を確認するには、shape属性を参照すると形状が確認できます。
- 3列の形状
array = np.array([1,2,3])
array.shape
- 3*2の配列
array = np.array([[1,2],[3,4],[5,6]])
array.shape
- 配列が何行なのか参照
array.shape[0]
- 配列が何列なのか参照
array.shape[1]
##形状の変換
形状の変換にはrehapeメソッドを使います。
特に列ベクトル(列数1の行列)への変換、多次元配列の1次元への変換は必須テクニックとなります。
array = np.array([[1,2],[3,4],[5,6]])
- 2*3列に変換
array.reshape(2,3)
- X行1列に変換
array.reshape(-1,1)
- 配列を1次元に変換
array.ravel()
##選択と抽出
配列の一部を選択・抽出したい場面は多くあります。
特に:(スライス)のテクニック忘れないように。
array = np.array([[1,2],[3,4],[5,6]])
- 1一行目を抽出
array[0]
- 2行目以降を抽出
array[1:]
- 2行目までを抽出
array[:2]
- 1行目の2列目を抽出
array[0, 1] #array[0][1]
- 2列目のみ抽出
array[:, 1]
##条件による選択
配列から、ある条件を満たす要素のみを取り出したい時や、ある条件を満たす要素を別の値に置き換えたい場合は、whereメソッドなどを使う。
array = np.array([[1,2],[3,4],[5,6]])
- 2を境にture,falseで返す
array > 2
- 2以上の数値を返す
array[array > 2]
ある条件を満たす要素を置き換える時は、whereメソッドを使う。引数の条件は(条件、 置き換える値、 条件を満たさない要素の値)。
- yが0.5以上で1、0.5以下で0を返す
x = np.arange(20).reshape(-1,1)
y = np.random.rand(20)
y = np.where(y < 0.5, 0, 1).reshape(-1,1)
- xのうちyが1になった値のみを抽出
x = np.arange(20).reshape(-1,1)
y = np.random.rand(20)
y = np.where(y < 0.5, 0, 1).reshape(-1,1)
##配列の結合
vstackは縦方向、hstackは横方向にそれぞれ配列を結合します。
- 縦方向に結合
array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8],[9,10],[11,12]])
np.vstack([array_1,array_2])
- 横方向に結合
array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8],[9,10],[11,12]])
np.hstack([array_1,array_2])
なお異なった形状の配列は結合することはできません。
array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8,9,10,11,12]])
print(array_1.shape)
print(array_2.shape)
##便利な配列生成方法
- 範囲を指定して配列を生成
np.arange(0, 10)
- 全ての配列が0の配列を生成。同様に1の配列はonesを使う。
np.zeros([3, 3])
- 指定した配列と同じ形状の0行列を生成。同様にoneslikeもある。
array = np.array([[1,2],[3,4],[5,6]])
np.zeros_like(array)
- 指定した範囲を等間隔で分割した配列を生成
np.linspace(0, 2, 5)
##乱数の生成
乱数の生成には、主にrandn,rand,randintのいずれかを使います。
乱数を固定するには、np.random.seed()を指定します
- 標準正規分布(平均0、分散1)に従って乱数を生成
np.random.randn(10)
- 0から1までの範囲で乱数を生成
np.random.rand(10)
- 指定した範囲の整数をランダムに抽出
np.random.randint(0, 100, 10) #0から100を10個生成する
##四則演算
もちろん四則演算も可能です。
array_1 = np.array([[1,2],[3,4],[5,6]])
array_2 = np.array([[7,8],[9,10],[11,12]])
- 和
array_1 + array_2
- 差
array_1 - array_2
- 商
array_1 * array_2
- 積
array_1 / array_2
- 累乗
array_1 ** 2 #もしくはnp.sqrt(array_1)
- 指数関数
np.exp(array)
- 対数関数
np.log1p(array)
##各種統計量
array = np.random.randint(0, 100, 20)
- 合計、平均、分散、標準偏差、最大値、最小値
np.sum(array)
np.mean(array)
np.var(array)
np.std(array)
np.max(array)
np.argmax(array) #最大値のインデックス
np.min(array)
np.argmin(array) #最小値のインデックス
##その他便利なやつ
array.dtype #データの型を調べる
array = np.random.randint(0, 100, 20, dtype="int32") #データの型を指定して配列を生成する(int32)
np.round(array, 2) #小数点以下2桁に揃える