2017/05/30
17:46

~補足~PythonライブラリNumpyについて



みなさんこんにちは。テック博士です。

前回までは助手くんがPythonライブラリの使用方法について
いろいろと説明してくれましたね。

今回も本当はその続きを書いてもらう予定だったのですが、
急に忙しくなってしまったので、今日は代わりに私が、
PythonライブラリのNumpyについて前回の説明に
少し補足をしておきたいと思います。



前回助手君が主に説明してくれたのはブロードキャスティング
という手法でしたね。

今回は機械学習プログラムのコーディングの際によく使用する、
行列の生成や分割、保存といった基本的な操作について、
コードをお見せしながらお話していこうかと思います。

① 行列の生成
import numpy as np

# ゼロ配列
a = np.zeros(shape)
# 連続した整数の配列
b = np.arange(start, stop).reshape(shape)
# 一様分布(乱数)
c = np.random.uniform(low, high, shape)
# 正規分布(乱数)
d = np.random.normal(ave, stddev, num)

"""
shape:配列の形
start:開始値
stop:終了値+1
low:下限値
high:上限値
ave:平均値
stddev:標準偏差
num:要素数
"""
 
 
いろいろありますが、よく使うのはこの辺りでしょうか。
例えばゼロ配列は、クラス分類の教師データがクラス番号で
与えられている時に、クラス数分の要素数を持つゼロベクトル
を生成し、クラス番号目の要素のみを1にするなどの使い方
をしたりします。
正規分布は重みの初期値などの設定時などです。

ちなみにshapeは多次元配列(行列はもちろん3次元以上でも)
でもOKです。


② 行列操作(分割と結合)
# 行で分割
e = np.vsplit(array, [row1, row2,...])
# 列で分割
f = np.hsplit(array, [col1, col2,...])
# 横に結合
g = np.hstack([array1, array2])
# 縦に結合
h = np.vstack([array1, array2])

"""
row1,row2,...:分割する際の下の行
col1,col2,...:分割する際の右の列
array1,array2:処理を行う対象の配列
"""
 
行列の基本的な結合、分割操作です。
機械学習でトレーニングデータとテストデータ、入力データと
教師データなどを分離するときに便利です。
このほかに特定の行や列のみを取り出すスライスなどもあります。

 
③保存とロード
# npyファイルとして保存
np.save(array, filepath)
# npyファイルをロードし、変数iに格納
i = np.load(filepath)
# テキストファイルとして保存
np.savatxt(filepath, delimiter=delimiter)
# テキストファイルをロードし、変数jに格納
j = np.loadtxt(filepath, delimiter=delimiter)

"""
filepath:保存するファイルのパス。
saveの場合には拡張子をnpy、savetxtの場合は何でも大丈夫ですが、
delimiterに合わせて決めると良いです。
たとえばdelimiter=','であればcsvなど
delimiter:区切り文字
"""

機械学習の際に途中の結果を保存したり、前回保存した結果を
読みだして学習の続きを行いたいときなどがありますよね。
その時に便利なのがこの保存と読み込みです。

保存した結果の数値を見て確認したいときにsavetxtを使用すると
良いでしょう。ただし、3次元以上の配列には対応していないので、
その際には通常のsaveを使用してください。


 他にもNumpyにはさまざまな処理が存在するので、
是非いろいろと調べて使用してみてください。
それでは、今回はここまでにしましょう。

お疲れ様でした!