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