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[:, idx1:idx2] = x如果x是 2D 也可以,但如果 x 是 1D 则不行。

4

3 回答 3

4

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

X[:, i] = x

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

X[:, start:end] = x

如果您不知道输入尺寸,我建议在一行或另一行之间切换if,尽管可能有一些我不知道的索引技巧会以相同的方式处理两者。

x有形状(N,)而不是形状(N, 1)(或(1, N)),因为 numpy 不是为矩阵数学而构建的。ndarrays 是 n 维的;它们支持任何非负维数(包括 0)的高效、一致的矢量化操作。虽然这有时可能会使矩阵运算变得不那么简洁(尤其是在dot矩阵乘法的情况下),但它会在您的数据自然是一维或 3、4 或 n 维时生成更普遍适用的代码。

于 2013-08-26T07:37:08.583 回答
0

Here are two tricks that make the code a little shorter.

X = numpy.zeros([10, 4])  # 2D array
x = numpy.arange(0,10)    # 1D array 
X.T[:1, :] = x
X[:, 2:3] = x[:, None]
于 2013-08-26T07:43:49.907 回答
0

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

第 3 行对我来说非常有意义,我会以这种方式分配给二维数组。

于 2013-08-26T07:39:16.553 回答