2016-12-08 15 views
1

2次元配列を再形成しようとしています。 (100000,100)を10ステップでLSTMシーケンスに変換する。 (100000,10,100)。私は以下のコードを使用しています:3次元LSTMシーケンスに2d入力を変形する

n_input = 100 
n_steps = 10 
a = np.arange(10000000).reshape(100000,100) 
b = np.empty([0,n_input]) 
c = np.empty([0,n_steps,n_input]) 

for i in range(a.shape[0]-n_steps+1): 
    b = np.empty([0,n_input]) 
    for j in range(n_steps): 
     b = np.vstack((b,a[j+1,])) 
    c = np.concatenate((c, b[np.newaxis,...]), axis=0) 

上記の処理には面倒な時間がかかるようです。これを書くより効率的な方法についての提案を求めることができますか?

+0

テストのために問題をスケールダウンします。つまり、_input、n_steps、およびreshapeの用語との関係は何ですか? – NaN

+0

ええ、小さなパラメータでうまいですが、可能であればPythonでループを使うことを避けることを好む – Caisho

+0

ものがディスクにスワップアウトされている場合は、チャンクでパーティションを分割する方が速いかもしれません。 – NaN

答えて

0
import time 
import numpy as np 


def _2d_to_3d(X, n_steps=10): 
    _X = np.zeros((X.shape[0]//n_steps,n_steps,X.shape[1])) 
    for i in range(len(X)//n_steps): 
     _X[i,:] = X[i*n_steps:i*n_steps+n_steps] 
    return _X 

def time_function(): 
    a = np.arange(10000000).reshape(100000,100) 
    start = time.time() 
    b = _2d_to_3d(a, 10) 
    total = time.time() - start 
    print('time: {}'.format(total)) 
    print('original shape: {}'.format(a.shape)) 
    print('new shape: {}'.format(b.shape)) 

time_function() 
time: 0.10249948501586914 
original shape: (100000, 100) 
new shape: (10000, 10, 100) 
関連する問題