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