向量添加向量

时间:2012-07-24 06:37:27

标签: python numpy

一个非常愚蠢的问题,但我无法想出正确的方法......

  1. A是2乘2矩阵,B是2乘1矩阵。
  2. 在10次迭代循环中,B_new = A * B. B_new是2比1。
  3. 每次迭代后将B_new保存到输出矩阵B_final。所以最后,B_final是2乘10。
  4. 但是,我在循环中将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 个答案:

答案 0 :(得分:5)

您看到的错误是因为当numpy广播c_final[:,i]np.dot(a,b)时,它会生成一个形状为(2,2)的数组,然后无法将其分配给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.dot(a,b)或类似的东西来展平np.squeeze,这样当它们一起广播时会生成一个2元素数组。例如:

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

您并不是唯一一个发现错误消息无益的人。大约一年前有人提出ticket这个问题。