如何将1D numpy数组分配给2D numpy数组?

时间:2013-08-26 07:22:30

标签: python arrays numpy multidimensional-array

考虑以下简单示例:

X = numpy.zeros([10, 4])  # 2D array
x = numpy.arange(0,10)    # 1D array 

X[:,0] = x # WORKS

X[:,0:1] = x # returns ERROR: 
# ValueError: could not broadcast input array from shape (10) into shape (10,1)

X[:,0:1] = (x.reshape(-1, 1)) # WORKS

有人可以解释为什么numpy有形状(N,)而不是(N,1)的向量? 从1D数组转换为2D数组的最佳方法是什么?

为什么我需要这个? 因为我有一个代码会将结果x插入到二维数组X中,并且x的大小会不时发生变化,所以如果X[:, idx1:idx2] = x是2D,我可以使用x如果x是1D,也不会。

3 个答案:

答案 0 :(得分:4)

您真的需要能够使用相同的功能处理1D和2D输入吗?如果您知道输入将是1D,请使用

X[:, i] = x

如果您知道输入将是2D,请使用

X[:, start:end] = x

如果您不知道输入维度,我建议使用if在一行或另一行之间切换,但可能会有一些索引技巧我不知道它会同时处理两个。< / p>

您的x形状(N,)而不是(N, 1)(或(1, N)),因为numpy不是仅为矩阵数学而构建的。 ndarray是n维的;它们支持任何非负数维度(包括0)的高效,一致的矢量化操作。虽然这可能偶尔会使矩阵运算变得不那么简洁(特别是在dot矩阵乘法的情况下),但是当数据自然是1维或3维,4或者n维。

答案 1 :(得分:0)

我认为你的答案已经包含在你的问题中了。 Numpy允许数组具有任何维度(虽然afaik Matlab在可能的情况下更喜欢两个维度),因此您需要对此进行更正(并始终区分(n,)和(n,1))。通过将一个数字作为索引之一(如第3行中的0),可以将维度减少一个。通过将范围作为索引之一(如第4行中的0:1),您不会降低维数。

第3行对我来说非常有意义,我会以这种方式分配给2-D阵列。

答案 2 :(得分:0)

以下是使代码缩短的两个技巧。

X = numpy.zeros([10, 4])  # 2D array
x = numpy.arange(0,10)    # 1D array 
X.T[:1, :] = x
X[:, 2:3] = x[:, None]