2016-12-08 3 views
1

Ich versuche, ein 2d-Array z. (100000,100) in eine LSTM-Sequenz mit 10 Schritten, dh. (100000,10,100). Ich verwende den folgenden Code unten:Reshape 2d Eingabe in eine 3d LSTM Sequenz

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) 

Das oben genannte scheint eine schreckliche Menge an Zeit zu verarbeiten. Kann ich nach Vorschlägen für eine effizientere Schreibweise fragen?

+0

skalieren Sie das Problem zum Testen ... dh, was ist die Beziehung zwischen _input, n_steps und den Bedingungen in der Umgestaltung? – NaN

+0

Ja, es ist in Ordnung mit kleineren Parametern, aber ich bevorzuge es, for-Schleifen in Python zu verwenden, wenn möglich – Caisho

+0

wenn Zeug auf die Festplatte ausgelagert wird, kann es schneller sein, ein Problem in Stücke zu zerlegen, das ist, was ich gemeint habe – NaN

Antwort

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)