2016-07-26 5 views
2

私は何か非常に単純な間違っていると思う。私は、空の2D numpy配列から始め、その配列に次元を追加したい(次元1行×4列)。numpy連結して空の多次元配列に新しい配列を追加しない

open_cost_mat_train = np.matrix([]) 

for i in xrange(10): 
    open_cost_mat = np.array([i,0,0,0]) 
    open_cost_mat_train = np.vstack([open_cost_mat_train,open_cost_mat]) 

私のエラートレースは、次のとおりです。

File "/Users/me/anaconda/lib/python2.7/site-packages/numpy/core/shape_base.py", line 230, in vstack 
    return _nx.concatenate([atleast_2d(_m) for _m in tup], 0) 
ValueError: all the input array dimensions except for the concatenation axis must match exactly 

私が間違って何をしているのですか?私は追加しようとしました、連結し、[]array([])と多くの他のものとして[[]]として空の2D配列を定義してください。

+1

アレイのリストを作成し、一度だけ 'vstack'を適用することをお勧めします。反復連結は遅い。 – hpaulj

答えて

2

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 
+0

私は 'arange(n)'を例として挙げましたが、実際には行列はforループから値を取得し、コストに敏感な分類子で実際の "コスト"のデータを取得します。 –

+0

コメントを解決するために私の答えを編集しました – Tonechas

+0

ゼロの列が最初の列の何らかの関数であればどうなりますか?この方法はまだ物事をスピードアップしますか? –

3

ますが、列の数は追加の配列一致するようにあなたの元の行列を再構築する必要があります。それは与え、その後

open_cost_mat_train = np.matrix([]).reshape((0,4)) 

を:

open_cost_mat_train 

# matrix([[ 0., 0., 0., 0.], 
#   [ 1., 0., 0., 0.], 
#   [ 2., 0., 0., 0.], 
#   [ 3., 0., 0., 0.], 
#   [ 4., 0., 0., 0.], 
#   [ 5., 0., 0., 0.], 
#   [ 6., 0., 0., 0.], 
#   [ 7., 0., 0., 0.], 
#   [ 8., 0., 0., 0.], 
#   [ 9., 0., 0., 0.]]) 
関連する問題