繁体   English   中英

如何将1D numpy数组分配给2D numpy数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM