如何将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, 。


你是否真的需要能够同时处理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维适用代码。


我想你的问题中已经包含了答案。 Numpy允许数组具有任何维度(而afaik Matlab在可能的情况下更喜欢两个维度),所以您需要对此进行正确的处理(并且始终区分(n,)和(n,1))。 通过给一个数字作为索引之一(如第三行中的0),可以将维度减1。 通过给出范围作为索引之一(如第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]
链接地址: http://www.djcxy.com/p/73859.html

上一篇: How to assign a 1D numpy array to 2D numpy array?

下一篇: split string with regex using a release character and separators