前提・実現したいこと
現在、データ処理のコードを書いています。
ただ、pythonなのでfor分の速度が遅いので、できればfor分を避けたいと思っていますが
どうしても思いつかずに下記のコードを書きました。
しかし、データ量が非常に大きく、処理に非常に多くの時間がかかってしまいます。
どなたか、より簡単で高速なアルゴリズムを教えてくれませんか。
尚、cf_histは20000行308列のデータです。
下記のコードの説明ですが
cf_Mは
ステップ1:for分jの計算
cf_histの中の1行目1,2,3,4,5,6,7列目の数字にそれぞれ
moment_lenの1,2,3,4,5,6,7番目の要素を掛け合わせ
次にcf_histの中の1行目8,9,10,11,12,13,14列目の数字にそれぞれ
moment_lenの1,2,3,4,5,6,7番目の要素を掛け合わせ
次にcf_histの中の1行目15,16,17,18,19,20,21列目の数字にそれぞれ
moment_lenの1,2,3,4,5,6,7番目の要素を掛け合わせ
次にcf_histの中の1行目22,23,24,25,26,27,28列目の数字にそれぞれ
moment_lenの1,2,3,4,5,6,7番目の要素を掛け合わせ
そして上記の全28個の数字の合計をリストに格納してやり、burden_hight[1]で割ります。
(上記の4回分の計算をj in range(4)で表現)
ステップ2:for分mの計算
次にステップ1でのcf_histの中の1行目29,30,31,32,33,34,35,36(ステップ1のcf_histの番号にプラス28した数字)に
ステップ1と同様にmoment_lenの1,2,3,4,5,6,7番目の要素を掛け合わせて、あとはステップ1と同じです。
ステップ3:for分kの計算
これを20000行(k:0~19999)繰り返してやります。
該当のソースコード
momnt_len = [0.0045, 0.0035, 0.02, 0, -0.02, -0.0035, -0.045] burden_hight = [0.01375,0.0175,0.02625,0.035,0.035,0.035,0.035,0.035,0.02625,0.0175,0.02375] cf_layer_M = [] for k in range(20000): print(k) for m in range(11): burdenhight = float(burden_hight[m]) for j in range(4): cf_M = (cf_hist[0+7*j+28*m][k]* momnt_len[0] + cf_hist[1+7*j+28*m][k]* momnt_len[1] + cf_hist[2+7*j+28*m][k]* momnt_len[2] +\ cf_hist[3+7*j+28*m][k]* momnt_len[3] + cf_hist[4+7*j+28*m][k]* momnt_len[4] + cf_hist[5+7*j+28*m][k]* momnt_len[5] +\ cf_hist[6+7*j+28*m][k]* momnt_len[6]) / (burdenhight) lst1.append(cf_M) cf_layer_M.append(sum(lst1))