[英]How to assign a 1D numpy array to 2D numpy 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
插入到2D数组X
并且x的大小不时变化所以我有X[:, idx1:idx2] = x
如果x
也是2D也可以工作,但如果x是1D则不行。
您是否真的需要能够使用相同的功能处理1D和2D输入? 如果您知道输入将是1D,请使用
X[:, i] = x
如果您知道输入将是2D,请使用
X[:, start:end] = x
如果您不知道输入维度,我建议使用if
在一行或另一行之间切换,尽管可能有一些索引技巧我不知道它会同时处理两者。
你的x
有形状(N,)
而不是形状(N, 1)
(或(1, N)
)因为numpy不是为矩阵数学而构建的。 ndarray是n维的; 它们支持任何非负数维度(包括0)的高效,一致的矢量化操作。 虽然这有时可能使矩阵运算不那么简洁(特别是在矩阵乘法的dot
的情况下),但是当数据自然是1维或3维,4维或n维时,它会产生更普遍适用的代码。
我想你的答案已经包含在你的问题中了。 Numpy允许数组具有任何维度(虽然afaik Matlab在可能的情况下更喜欢两个维度),因此您需要对此进行更正(并始终区分(n,)和(n,1))。 通过将一个数字作为索引之一(如第3行中的0),可以将维度减少一个。 通过将范围作为索引之一(如第4行中的0:1),您不会降低维数。
第3行对我来说非常有意义,我将以这种方式分配给2-D阵列。
这里有两个技巧,使代码更短。
X = numpy.zeros([10, 4]) # 2D array
x = numpy.arange(0,10) # 1D array
X.T[:1, :] = x
X[:, 2:3] = x[:, None]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.