我打赌我做的事情非常简单。我想从一个空的2D numpy数组开始,并向其追加数组(维度为1行4列)。
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
我做错了什么?我尝试过追加,连接,将空的2D数组定义为[[]]
,[]
,array([])
等等。
答案 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.]])
答案 1 :(得分:2)
如果open_cost_mat_train
很大,我建议您使用矢量化算法替换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
我假设填充ocmt
第一列的值(open_cost_mat_train
的简写)是从for循环中获取的,其余列是第一列的函数,正如您对我原来答案的评论中所述。由于实际成本数据不可用,在下一个示例中,第一列中的值是随机数,第二列,第三列和第四列是函数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)
在两个函数中初始化。请注意,已使用numpy.allclose
而不是fvstack() == fshape()
执行了相等性测试,以避免与浮点artihmetic相关的舍入错误。
关于效率,以下交互式会话显示初始化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