2013-08-26 138 views
7

考虑下面的简单示例:如何将1D numpy数组分配给2D numpy数组?

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)? 从一维数组转换为二维数组的最佳方式是什么?

为什么我需要这个? 因为我有一个代码插入结果x到二维数组X和x的大小随时变化,所以我有X[:, idx1:idx2] = x如果x也是2D也可以,但如果x是1D,则不起作用。

回答

4

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

X[:, i] = x 

如果你知道的输入将是2D,使用

X[:, start:end] = x 

如果你不知道输入的尺寸,我推荐在一行或另一行之间切换与if,虽然可能有一些索引技巧,我不知道这将处理两个相同。

x具有形状(N,)而不是塑造(N, 1)(或(1, N)),因为numpy的不只是矩阵数学建。 ndarrays是n维的;它们支持任何非负数维度(包括0)的高效,一致的矢量化操作。虽然这可能偶尔会使矩阵运算稍微简洁一些(特别是在矩阵乘法的情况下,dot),但它会为您的数据自然是1维或3维,4维或n维时生成更通用的代码。

0

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

第3行对我来说非常合理,我将以这种方式分配给2-D数组。

0

这里有两个技巧,使代码有点短。

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

你能否再添加一些评论?我不清楚你是如何从原始代码中获得的,以及为什么这能解决问题。 – brandones