我有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,)
。
答案 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]
传递数组