Numpy矩阵行堆叠

时间:2015-01-30 00:17:29

标签: python arrays numpy

我有4个数组(所有长度相同),我试图将它们堆叠在一起以创建一个新数组,其中每个数组都是一行。

我的第一个想法是:

B = -np.array([[x1[i]],[x2[j]],[y1[i]],[y2[j]]])

然而,其形状为(4,1,20)

为了获得我预期的2D输出,我采用了这个:

B = -np.vstack((np.vstack((np.vstack(([x1[i]],[x2[j]])),[y1[i]])),[y2[j]]))

形状为(4,20)

有更好的方法吗?为什么第一种方法不起作用?

修改

为清楚起见,x1[i], x2[j], y1[i], y2[j]的形状都是(20,)

2 个答案:

答案 0 :(得分:2)

np.vstack将一系列等长数组堆叠起来,一个在另一个上面,只要它们具有兼容的形状即可。所以在你的情况下,一维数组的元组会这样做:

np.vstack((x1[i], x2[j], y1[i], y2[j]))

会做你想要的。如果这个语句是构建许多这样的4x20阵列的循环的一部分,那么这可能是另一回事。

答案 1 :(得分:2)

问题在于额外的括号:

B = -np.array([[x1[i]],[x2[j]],[y1[i]],[y2[j]]]) # (4,1,20)
B = -np.array([x1[i],x2[j],y1[i],y2[j]])         # (4,20)

[[x1[i]]的形状为(1,20)

In [26]: np.array([np.ones((20,)),np.zeros((20,))]).shape
Out[26]: (2, 20)

vstack有效,但np.array同样有效。它是concatenate,需要额外的括号

In [27]: np.vstack([np.ones((20,)),np.zeros((20,))]).shape
Out[27]: (2, 20)

In [28]: np.concatenate([np.ones((20,)),np.zeros((20,))]).shape
Out[28]: (40,)

In [29]: np.concatenate([[np.ones((20,))],[np.zeros((20,))]]).shape

vstack不需要额外的维度,因为它首先通过[atleast_2d(_m) for _m in tup]传递数组