如何将一个1D的numpy数组赋值给2D的numpy数组?

7
请问需要将以下内容翻译成中文?

考虑以下简单的示例:

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是2D时,X [:,idx1:idx2] = x有效,但如果x是1D,则无效。
3个回答

4

您是否需要使用同一函数来处理1D和2D输入?如果您知道输入将是1D,请使用

X[:, i] = x

如果您知道输入将是二维的,请使用:
X[:, start:end] = x

如果您不知道输入的维度,我建议使用if在一行或另一行之间进行切换,虽然可能有一些索引技巧是我不知道的,可以同时处理两者。
您的x的形状为(N,)而不是(N, 1)(或(1, N)),因为numpy不仅仅用于矩阵运算。ndarrays是n维数组;它们支持任意非负数维度(包括0)的高效、一致的向量化操作。虽然这可能偶尔会使矩阵运算更加冗长(特别是在矩阵乘法的情况下),但它会产生更普遍适用的代码,用于当您的数据自然是1维或3、4或n维时。

0

这里有两个技巧,可以让代码变得更简洁。

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

3
你能加一些注释吗?我不清楚你是怎么从原始代码得出这个解决方案的,以及为什么它可以解决问题。 - brandones

0

我认为你已经在问题中包含了答案。Numpy允许数组具有任意维度(而据我所知,Matlab更喜欢使用可能的二维),因此您需要正确处理这一点(并始终区分(n,)和(n,1))。通过将一个数字作为索引之一(例如第3行中的0),您可以将维数减少一维。通过将范围作为索引之一(例如第4行中的0:1),您不会减少维数。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接