Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy连接不向空多维数组追加新数组_Python_Arrays_Numpy_Multidimensional Array_Concatenation - Fatal编程技术网

Python numpy连接不向空多维数组追加新数组

Python numpy连接不向空多维数组追加新数组,python,arrays,numpy,multidimensional-array,concatenation,Python,Arrays,Numpy,Multidimensional Array,Concatenation,我打赌我做错了一件很简单的事。我想从一个空的2D numpy数组开始,并向其追加数组(维度为1行4列) 我的错误跟踪是: 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

我打赌我做错了一件很简单的事。我想从一个空的2D numpy数组开始,并向其追加数组(维度为1行4列)

我的错误跟踪是:

  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数组定义为
[[]]
、as
[]
数组([])
和许多其他数组。

您需要重塑原始矩阵,以便列数与追加的数组匹配:

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.]])

如果
open\u cost\u mat\u 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
(开放式成本材料列车的缩写)第一列的值是从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)
在这两个函数中初始化随机数生成器。请注意,已使用而不是
fvstack()==fshape()
执行相等性测试,以避免与浮点Artimetic相关的舍入错误

至于效率,下面的交互式会话显示,使用最终形状初始化
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
。重复连接速度很慢。我以
arange(n)
为例,但实际上,矩阵将从for循环中获取值,该循环在成本敏感分类器中获取实际“成本”数据。如果零列是第一列的某个函数,会发生什么?这种方法还会加快速度吗?是的,会的。我再次编辑了我的答案,以向您展示矢量代码如何提高应用程序的速度。
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