プログラム開発備忘録

プログラム開発備忘録

プログラム開発中に詰まった箇所を備忘録として記録します。

【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))で保存が出来る