如何将长度为x的1D numpy数组分配给2D Numpy数组的长度为y的元素?

时间:2015-12-03 10:22:00

标签: python numpy

我正在寻找一种方法,将由x个元素组成的1D numpy数组分配给2D numpy数组形状(y,z)。

示例:

A=np.array([[0],[0],[0]])
A[2]=np.array([0,2])

哪个应该导致

A=[[0],[0],[0,2]]

使用python列表可以很好地工作,但是在尝试numpy时遇到了很大的麻烦,通常会导致错误消息:

could not broadcast input array from shape (z) into shape (x)

这似乎是因为numpy复制了所有内容而不是修改数组。我最近才开始使用numpy,如果有人能帮助找到有效的方法,我真的很感激。

1 个答案:

答案 0 :(得分:1)

实际上问题是Numpy 拒绝执行隐式复制或重塑。例如:

>>> A=np.array([[0],[0],[0]])
>>> A[2]=np.array([0,2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (2) into shape (1)

这里A[2]是形状为1的A的子阵列.2个单元格不能适合1,所以我们得到形状误差。相反的情况是可能的,称为广播:

>>> A[0:2]=5
>>> A
array([[5],
       [5],
       [0]])

此处已广播单个标量以更新整个子阵列。我们可以调整大小A以适应形状2条目:

>>> A.shape
(3, 1)
>>> A.resize((3,2))
>>> A.shape
(3, 2)
>>> A[2]=np.array([0,2])
>>> A
array([[5, 5],
       [0, 0],
       [0, 2]])

我们可以看到调整大小实际上重组了我们的细胞。它仍然以5 5 0开始,但单元格不再沿着单个列。这是因为除非被要求,否则numpy不会复制;我们所有的多单元片实际上都是指同一个原始数组。我们可以制作第二个矩阵并将原始文本复制到一个列中:

>>> B=np.zeros((A.shape[0]+1,A.shape[1]))
>>> B[:,0]=A.transpose()
>>> B
array([[ 5.,  0.],
       [ 5.,  0.],
       [ 0.,  0.]])

转置是因为B的切片是1维形状(3长)而不是像A的2维形状(1宽3高)。 Numpy认为1维阵列是水平形状,因此适合3宽1高矩阵。您可以将其视为复制电子表格中的一系列单元格。

值得注意的是,放在B中的数字是A中的数字的副本。这是因为我们对B进行了修改。视图可用于操纵矩阵的各个部分(包括以另一种形状看到它,如转置( )),例如:

>>> C=B[::-1,1]
>>> C
array([ 0.,  0.,  0.])
>>> C[:]=[1,2,3]
>>> B
array([[ 5.,  3.],
       [ 5.,  2.],
       [ 0.,  1.]])