将一个向量添加到数组中

3

这可能是一个非常愚蠢的问题,但我无法找到正确的方法...

  1. A是一个2x2的矩阵,B是一个2x1的矩阵。
  2. 在一个10次迭代循环中,B_new=A*B。B_new是2x1的。
  3. 在每次迭代后将B_new保存到输出矩阵B_final中。所以最终,B_final是2x10的。

然而,在循环中将B添加到B_new时,我遇到了问题。以下是我的代码,有人可以给我一些建议吗?

import numpy as np
a=np.ones(shape=(2,2))
b=np.ones(shape=(2,1))     
c_final=np.zeros(shape=(2,10)) 

for i in range(0,10):
    c=np.dot(a,b)
    b=c
    c_final[:,i]=c

以下是错误信息:

    c_final[:,i]=c
ValueError: output operand requires a reduction, but reduction is not enabled
1个回答

5
您看到的错误是因为numpy在广播 c_final [:,i] 和 np.dot(a,b)时一起产生一个形状为(2,2)的数组,然后不能分配给< c> c_final [:,i] ,因为它的形状为(2,1)。我认为如果您只是在解释器中玩耍,那么情况会更加清晰:
>>> import numpy as np
>>> a = np.ones((2,2))
>>> b = np.ones((2,1))
>>> c_final = np.zeros((2,10))
>>> np.dot(a,b)
array([[ 2.],
       [ 2.]])
>>> np.dot(a,b).shape
(2, 1)
>>> c_final[:,0]
array([ 0.,  0.])
>>> c_final[:,0].shape
(2,)
>>> np.broadcast(c_final[:,0],np.dot(a,b)).shape
(2, 2)

解决这个问题的方法是通过使用np.squeeze或类似的函数来压缩np.dot(a,b),以便它们在广播时产生一个包含2个元素的数组。例如:

>>> c_final[:,0] = np.dot(a,b).squeeze()

在发现错误信息无法帮助你时,你并不孤单。大约一年前,有人提交了一个工单来反映这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接