如何将长度为x的1D numpy数组指定给长度为y的2D numpy数组的元素?

2024-04-27 00:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

示例:

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,如果有人能帮我找到一个有效的方法,我会非常感激。你知道吗


Tags: 方法numpy消息元素示例列表错误np
1条回答
网友
1楼 · 发布于 2024-04-27 00:19:09

实际上,问题是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的大小以适应shape 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将一维数组视为水平形状,因此适合3宽1高的矩阵。你可以把它想象成在电子表格中复制一系列单元格。你知道吗

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

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

相关问题 更多 >