numpy concatenate不会将新数组附加到空多维数组

时间:2016-07-26 17:49:05

标签: python arrays numpy multidimensional-array concatenation

我打赌我做的事情非常简单。我想从一个空的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([])等等。

2 个答案:

答案 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 + 110*xx/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