62299


pythonにて機械学習用に  
「『行列をnumpy形式で保存したファイル（のペア）』を読み出し、行をランダムに入れ替えて、numpy形式で保存する。これを複数ファイル分行う」という処理をしています。

『行列をnumpy形式で保存したファイル（のペア）』の行列サイズは2000万×33と2000万×1で、ファイル数は10です。

こちらの処理を高速化したいのですが、以下コードの中で、改良できそうな点はありますでしょうか？

今まで、<https://qiita.com/shaka/items/f180ae4dc945dc7b9066>
を参考に、サイズを小規模にして一時変数の利用などは試してみたのですが、早くなったり逆に遅くなったりして、変化が見られませんでした。

少しでも解決できそうな手段をご存じの方がいたら、アドバイス頂けると幸いです。よろしくお願い致します。  
コード：

[code]

    # 定義済みの変数
    # file_listx： 1種類目のデータが保存されているファイル名のリスト(例：['x1.npy','x2.npy',…,'x10.npy'])
    # file_listy： 2種類目のデータが保存されているファイル名のリスト(例：['y1.npy','y2.npy',…,'y10.npy'])
    
    # ディレクトリにあるファイル
    # x1.npy, x2.npy, …, x10.npy： それぞれ、サイズ2000万×33の行列
    # y1.npy, y2.npy, …, y10.npy： それぞれ、サイズ2000万×1のベクトル
    
    for i in range(len(file_listx)):
        #データの読み込み
        data_x = np.load(file_listx[i]) #ペアのうち1種類目の、i番目のnumpyファイル（行列サイズ：2000万×33）
        data_y = np.load(file_listy[i]) #ペアのうち2種類目の、i番目のnumpyファイル（行列サイズ：2000万×1）
    
        rand_x = np.zeros_like(data_x)
        rand_y = np.zeros_like(data_y)
    
        #シャッフル用のインデックス準備
        index = np.arange(data_x.shape[0])
        np.random.shuffle(index)
    
        #シャッフル
        for j in range(data_x.shape[0]):
            rand_x[j,:] = data_x[index[j],:]
            rand_y[j,:] = data_y[index[j],:]
    
        #tensorに変換
        rand_x = torch.from_numpy(rand_x).float()
        rand_y = torch.from_numpy(rand_y).float()
    
        #保存
        np.save(file_listx[i],rand_x)
        np.save(file_listy[i],rand_y)
    
[/code]


CC BY-SA 4.0
2020-01-16T07:43:00.460
62287
2020-01-16T12:00:05.937
2020-01-16T07:48:35.890
30785
question
python python3 numpy 深層学習
pythonでのfor文の高速化（numpyファイル処理）


劇的な効果があるかわかりませんが:

  1. グローバルで処理を行わない
  2. `np.random.shuffle` を使う

である程度改善しませんか。

[code]

    import numpy as np
    import torch
    
    
    def modify(data):
        np.random.shuffle(data)
        return torch.from_numpy(data).float()
    
    
    def main(file_listx, file_listy):
        # 定義済みの変数
        file_listx = [f"x{i+1}.npy" for i in range(10)]
        file_listy = [f"y{i+1}.npy" for i in range(10)]
    
        for path in file_listx + file_listy:
            data = np.load(path)
            np.save(path, modify(data))
    
    
    if __name__ == '__main__':
        main()
    
[/code]


CC BY-SA 4.0
2020-01-16T12:00:05.937
62299
2020-01-16T12:00:05.937
62
62287
answer