向量添加向量

TH3*_*339 3 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.

但是,我有一个循环中将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
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

    c_final[:,i]=c
ValueError: output operand requires a reduction, but reduction is not enabled
Run Code Online (Sandbox Code Playgroud)

use*_*424 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)
Run Code Online (Sandbox Code Playgroud)

解决这个问题的方法是np.dot(a,b)通过使用np.squeeze或类似的东西来平坦化,以便当它们一起广播时产生2元素阵列.例如:

>>> c_final[:,0] = np.dot(a,b).squeeze()
Run Code Online (Sandbox Code Playgroud)

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