【Python】csvファイルを読み込んで、npyファイルで保存する【Google Colaboratory】
なぜnpyファイルに変換するのか
機械学習を行う際に、自分で計測した結果が記録してあるcsvデータを読み込むことが必要となった
データ数が増えるとcsvファイルの読み込みに時間がかかるので、学習モデルを変更する度に大量のデータを読み込む時間が鬱陶しくなる
npyファイルの読み込みは処理が速いので、一度csvファイルを読み込んでnpyファイルとして保存し、次からはnpyファイルを読み込む
結果
テストとして自作データ(28データ)を読み込む際の読み込み時間を比較する
csvファイルの読み込み時間:243.9秒
npyファイルの読み込み時間:24.4秒
後で見直す際にコード全文をすぐ見たいので先にコード全文を載せておきます
~コード全文~
from google.colab import drive drive.mount('/content/gdrive',force_remount=True) import numpy as np import os import glob #末尾から0を取り除く def trim_zeros(arr): """Returns a trimmed view of an n-D array excluding any outer regions which contain only zeros. """ slices = tuple(slice(idx.min(), idx.max() + 1) for idx in np.nonzero(arr)) return arr[slices] def save_npy(files,save_folder_path): i=0 for file in files: X_data = np.loadtxt(file, # 読み込みたいファイルのパス delimiter=",", # ファイルの区切り文字 skiprows=0, # 先頭の何行を無視するか(指定した行数までは読み込まない) usecols=(0,1), # 読み込みたい列番号 ndmin = 2 # 返される配列の次元数の指定 ) y_data = np.loadtxt(file, # 読み込みたいファイルのパス delimiter=",", # ファイルの区切り文字 skiprows=0, # 先頭の何行を無視するか(指定した行数までは読み込まない) usecols=(9) # 読み込みたい列番号 ) #末尾から0を取り除く(trim_zeros()) X_data = trim_zeros(X_data) y_data = trim_zeros(y_data) min_size = min(len(X_data),len(y_data)) X_data = X_data[:min_size,:] y_data = y_data[:min_size] # ディレクトリがなければ作成 os.makedirs(save_folder_path + '/X_data', exist_ok=True) os.makedirs(save_folder_path + '/y_data', exist_ok=True) #拡張子npyで保存 np.save(save_folder_path + '/X_data' + '/X_data{}'.format(i), X_data) np.save(save_folder_path + '/y_data' + '/y_data{}'.format(i), y_data) print('read_files {}/{} data finished'.format(i+1,len(files))) i = i+1 #データファイル名読み込み folder_path = './gdrive/My Drive/Colab Notebooks/EMG_estimation/EMG_data' files = glob.glob("{}/*".format(folder_path)) #保存するフォルダ名 save_folder_path = './gdrive/My Drive/Colab Notebooks/EMG_estimation/EMG_data_npy' save_npy(files,save_folder_path)
~モジュールのimportなど~
#Googleドライブのマウント from google.colab import drive drive.mount('/content/gdrive',force_remount=True) import numpy as np import os import glob
初めの3行はGoogleドライブ内のファイルを参照する際に必要となる
実行して出てきたURLからアカウントを選択して許可を押すとコードが出てくるので、コピーして「Enter your authorization code:」にペーストする
~ファイル名(.csv)の読み込み~
#データファイル名読み込み folder_path = './gdrive/My Drive/Colab Notebooks/EMG_estimation/EMG_data' files = glob.glob("{}/*".format(folder_path))
関数glob()によってフォルダー内のすべてのファイルを読み込むことが可能
~データ末尾の0を取り除く~
#末尾から0を取り除く def trim_zeros(arr): """Returns a trimmed view of an n-D array excluding any outer regions which contain only zeros. """ slices = tuple(slice(idx.min(), idx.max() + 1) for idx in np.nonzero(arr)) return arr[slices]
自分の扱うデータは、データの末尾が0で埋められているので取り除く関数を定義しておきます
※これは各々のデータに合わせて削除してもらってもかまいません
~データ(.csv)の読み込み~
X_data = np.loadtxt(file, # 読み込みたいファイルのパス delimiter=",", # ファイルの区切り文字 skiprows=0, # 先頭の何行を無視するか(指定した行数までは読み込まない) usecols=(0,1), # 読み込みたい列番号 ndmin = 2 # 返される配列の次元数の指定 ) y_data = np.loadtxt(file, # 読み込みたいファイルのパス delimiter=",", # ファイルの区切り文字 skiprows=0, # 先頭の何行を無視するか(指定した行数までは読み込まない) usecols=(9) # 読み込みたい列番号 ) #末尾から0を取り除く(trim_zeros()) X_data = trim_zeros(X_data) y_data = trim_zeros(y_data) #データのサイズを合わせる min_size = min(len(X_data),len(y_data)) X_data = X_data[:min_size,:] y_data = y_data[:min_size]
関数np.loadtxt()により、csvデータの読み込みを行う
usecolsで読み込みたい列の指定も可能
データ末尾が欠損している場合があるのでデータサイズを合わせている
~npyデータの保存~
# ディレクトリがなければ作成 os.makedirs(save_folder_path + '/X_data', exist_ok=True) os.makedirs(save_folder_path + '/y_data', exist_ok=True) #拡張子npyで保存 np.save(save_folder_path + '/X_data' , X_data) np.save(save_folder_path + '/y_data' , y_data)
関数np.save(保存するフォルダーのパス+ファイル名,保存するデータ(ndarray))で保存が出来る