2012-07-24 61 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