考虑以下简单示例:
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,也不会。
答案 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]