2012-07-24 60 views
3

甲很笨的问题,但我不能图中的右侧的方式..添加载体来阵列

  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 

以下是错误消息:

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

回答

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.squeeze或类似的东西来压平np.dot(a,b)这样,当他们播出它们共同产生一个2元素的数组。例如:

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

您在发现错误消息无益并不孤单。大约一年前,有人提交了关于此的ticket

+0

非常感谢! – 2012-07-24 14:00:57