NumPyを使うと幸せになれるかも1: データの読み込み
はじめに
こんにちは.
私は普段Pythonでプログラミングをすることが多いです.
Python以外はほとんど使いません.
私がPythonを使うのは
- 楽にコードが書ける
- CaffeやChainerなどの深層学習用のライブラリをPythonから使える
- そもそも他の言語がよくわからない
なんだか名前が可愛い
といったところが理由です.
一方で,私が所属している研究室のPython使いは少数派です.
そのような状況で私が困ったことは全く無いのですが,
「Pythonをこう使えば,もっと幸せになれると思うんだけどなぁ.」
と,周りの人を見て思うことは多々有ります.
今回の記事では,NumPyを使うと幸せになれるかも」と題しまして,
Pythonの行列演算ライブラリNumPyを使って,
幸せになれるかもしれない方法を紹介できればと思っています.
※注意※
この記事は初心者向けですので,
普段からPythonを使ってらっしゃる方にとっては退屈なお話だと思われます.
Python使いからのツッコミもお待ちしております.
numpy.save()とnumpy.load()
今回の記事で紹介したかったのはこの2つのメソッドです.
想像がつくと思いますが,
その名の通りnumpyの配列を保存・読み込みができます.
それぞれ具体的な使い方は以下の通りです.
import numpy as np # numpy.ndarray array = np.array([1, 2, 3]) print array # 配列の保存 # 引数はファイル名, 配列名 np.save('array.npy', array) # 配列の読み込み # 引数はファイル名、返り値が配列 new_array = np.load('array.npy') print new_array
注目すべき点はその読み込みの速さです. 私の場合,画像処理や機械学習の対象として,大量の画像を取り扱うことがよくあります. この時,画像を読み込んで,画像処理やら機械学習の計算をさせるといったプログラムを作成するのですが,この画像を読み込むフェーズにどうしても時間がかかってしまいます.
そこで,numpy.save()とnumpy.load()の出番です. プログラムの初回起動時には画像を素直に読み込んでおき,numpy.save()で保存しておきます.次回起動時には初回起動時に保存したファイルを読み込むようにします.
その読み込みの速さを確認していただくために,素直な画像の読み込みとnumpy.load()による読み込みの実行時間を比較してみましょう.
#!/usr/bin/python # -*- coding: utf-8 -*- import numpy as np import cv2, os, time # 複数の画像を読み込んでnumpy配列にする関数 def imgsread(path): # ディレクトリ中のファイル名のリストを取得 filelists = os.listdir(path) print 'number of files: ', len(filelists) # 読み込んだ画像をリストに追加 imgs = [] for f in filelists: img = cv2.imread(f) imgs.append(img) # リストをnumpyに変換 return np.asarray(imgs) # 画像の読み込み時間の計測 s1 = time.time() array1 = imgsread('hogehoge/foo/bar') print 'imgsread()', time.time() - s1 # 画像をnpy形式で保存 np.save('array.npy', array1) # npyファイルの読み込み時間の計測 s2 = time.time() array2 = np.load('array.npy') print 'np.load()', time.time() - s2
number of files: 60000 imgsread() 0.231508970261 np.load() 0.0085620880127
小さい画像で実験したので,あまりありがたみは感じられませんでしたが,npy形式で保存させておくメリットはご理解いただけたかと思います.
おわりに
いかがでしたでしょうか. 既にご存知の方もいらっしゃったかもしれませんが, numpyを有効活用して幸せになれる方法が少しでも布教できたら何よりです・
また,numpyにはnumpy.loadtxt()というcsvファイルを読み込んでくるメソッドがありますが, この場合もcsvからではなく,npyファイルにしてからnumpy.load()で読んでくる方が速いみたいです(要検証).
それでは次の記事でお会いしましょう. さようなら.