我正在寻找一种方法,将由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,如果有人能帮助找到有效的方法,我真的很感激。
答案 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.]])