私はちょうどより多くの時間をチェックして、あなたのコードを実行し、train1
ためのランダム生成された行列使用して:私はこれを実行すると
import time
import numpy as np
t_total=time.time()
train1=np.random.random((20, 550))
df1=train1[1,1:52]
for i in range(5):
t1 = time.time()
tj = []
for j in range(52,551):
t2 = time.time()
x=train1[i,(j-51):j]
df1=np.concatenate((df1,x),axis=0)
tj.append(time.time()-t2)
print("Time to loop on j:", time.time()-t1)
print("Average time for each j:", np.mean(tj))
print("Total time:", time.time()-t_total)
を私は明らかに、すべてのループが長くなると長いことを示す、次の出力を取得します。
Time to loop on j: 0.009780406951904297
Average time for each j: 1.9157577851e-05
Time to loop on j: 0.02693343162536621
Average time for each j: 5.33469932113e-05
Time to loop on j: 0.06705927848815918
Average time for each j: 0.000133752822876
Time to loop on j: 0.08919048309326172
Average time for each j: 0.000178138813179
Time to loop on j: 0.11366486549377441
Average time for each j: 0.000227188060661
Total time: 0.3072977066040039
私の推測では、次のとおりです。np.vstack
は、単純マトリクス入力のサイズが大きくなるとより多くの時間を要し、それはあなたの実行時間が指数関数的に増加させているものです。しかし、この問題に対処するnumpyと同等のものを見つけることはできないようです...スタックしたいすべての配列をリストに格納し、最後にスタックを計算するという解決策があります:
import time
import numpy as np
t_total=time.time()
train1=np.random.random((20, 550))
df1=[train1[1,1:52]]
for i in range(5):
t1 = time.time()
tj = []
for j in range(52,551):
t2 = time.time()
x=train1[i,(j-51):j]
df1.append(x)
tj.append(time.time()-t2)
print("Time to loop on j:", time.time()-t1)
print("Average time for each j:", np.mean(tj))
df1 = np.vstack(df1)
print("Total time:", time.time()-t_total)
と実行時間が、これは私を取得します。
Time to loop on j: 0.0005383491516113281
Average time for each j: 7.99347260194e-07
Time to loop on j: 0.0005192756652832031
Average time for each j: 7.58734876981e-07
Time to loop on j: 0.0005254745483398438
Average time for each j: 7.73546452035e-07
Time to loop on j: 0.0005245208740234375
Average time for each j: 7.73546452035e-07
Time to loop on j: 0.0005295276641845703
Average time for each j: 7.80235550447e-07
Total time: 0.008821249008178711
多くの小さな配列を積み重ねることは、大きな配列、またはそのような何かを積み重ねるよりも簡単であると思われます。固定サイズのオブジェクトをリストに追加すると、リストのサイズにかかわらず固定コストが発生します。
コードの小さな部分の実行時間を調べてみましたか?特に毎回 '' j ''をループするのにかかる時間と '' j ''上のループ内の行を実行するのにかかる時間をチェックすることを考えています。そうすれば、実行時間が予期せずにどこまで正確に変化するかについての洞察が得られます。 –
また、実際の例を教えてください。 'train1'へのアクセスがなければ、コードを自分で実行することはできませんし、何が起こっているのかを理解するためにテストすることはできません。 –
こんにちはアーサー 私がここで使用しているマトリックスは、Wikipediaの競技会用のKaggleトレーニングセットのトレーニングセットです。私がパンダのデータフレームに読み込んだ[link](https://www.kaggle.com/c/web-traffic-time-series-forecasting/data)からtrain_1.csvをダウンロードして、numpyの行列に変換することができます(つまり 'train1').to_matrix()を使用します。これがうまくいけばいいです –