open_cost_mat_train
が大きい場合は、私はあなたを励ましますforループをベクトル化アルゴリズムで置き換えます。私は効率がベクトル化ループによって改善される方法を示すために、次のfuntionsを使用する:(open_cost_mat_train
ための速記)ocmt
の最初の列を移入値はforループから得られることを私が想定き
def fvstack():
import numpy as np
np.random.seed(100)
ocmt = np.matrix([]).reshape((0, 4))
for i in xrange(10):
x = np.random.random()
ocm = np.array([x, x + 1, 10*x, x/10])
ocmt = np.vstack([ocmt, ocm])
return ocmt
def fshape():
import numpy as np
from numpy.matlib import empty
np.random.seed(100)
ocmt = empty((10, 4))
for i in xrange(ocmt.shape[0]):
ocmt[i, 0] = np.random.random()
ocmt[:, 1] = ocmt[:, 0] + 1
ocmt[:, 2] = 10*ocmt[:, 0]
ocmt[:, 3] = ocmt[:, 0]/10
return ocmt
、及び残りの列は、私の元の答えに対するあなたのコメントに記載されているように、最初の列の関数です。実コストデータが利用できないので、次の例では、第1列の値は乱数であり、第2列、第3列および第4列はそれぞれx + 1
,10*x
およびx/10
であり、x
は最初の列の対応する値カラム。
In [594]: fvstack()
Out[594]:
matrix([[ 5.43404942e-01, 1.54340494e+00, 5.43404942e+00, 5.43404942e-02],
[ 2.78369385e-01, 1.27836939e+00, 2.78369385e+00, 2.78369385e-02],
[ 4.24517591e-01, 1.42451759e+00, 4.24517591e+00, 4.24517591e-02],
[ 8.44776132e-01, 1.84477613e+00, 8.44776132e+00, 8.44776132e-02],
[ 4.71885619e-03, 1.00471886e+00, 4.71885619e-02, 4.71885619e-04],
[ 1.21569121e-01, 1.12156912e+00, 1.21569121e+00, 1.21569121e-02],
[ 6.70749085e-01, 1.67074908e+00, 6.70749085e+00, 6.70749085e-02],
[ 8.25852755e-01, 1.82585276e+00, 8.25852755e+00, 8.25852755e-02],
[ 1.36706590e-01, 1.13670659e+00, 1.36706590e+00, 1.36706590e-02],
[ 5.75093329e-01, 1.57509333e+00, 5.75093329e+00, 5.75093329e-02]])
In [595]: np.allclose(fvstack(), fshape())
Out[595]: True
fvstack()
とfshape()
同じ結果を生成するためにコールのために、乱数発生器はnp.random.seed(100)
介して両方の機能に初期化されます。浮動小数点の工作に関連する丸め誤差を避けるため、fvstack() == fshape()
の代わりにnumpy.allclose
を使用して等価性テストを実行したことに注目してください。効率については、次の対話型セッションはその最終形状とocmt
を初期化すると、繰り返し行を積み重ねるよりもはるかに高速であることを示している
:
In [596]: import timeit
In [597]: timeit.timeit('fvstack()', setup="from __main__ import fvstack", number=10000)
Out[597]: 1.4884241055042366
In [598]: timeit.timeit('fshape()', setup="from __main__ import fshape", number=10000)
Out[598]: 0.8819408006311278
アレイのリストを作成し、一度だけ 'vstack'を適用することをお勧めします。反復連結は遅い。 – hpaulj