2012-07-24 4 views
3

Une question vraiment stupide, mais je ne pouvais pas la bonne façon ..Ajouter un vecteur à un tableau

  1. A est un 2 par 2 matrice, et B est un 2 par 1 matrice.
  2. Dans une boucle de 10 itérations, B_new = A * B. B_new est 2 par 1.
  3. Enregistrer B_new dans une matrice de sortie B_final après chaque itération. Donc, à la fin, B_final vaut 2 par 10.

Cependant, j'ai un problème d'ajout de B à B_new dans une boucle. Voici mon code, quelqu'un peut-il me donner quelques suggestions?

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 

Voici le message d'erreur:

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

Répondre

5

L'erreur que vous voyez est parce que quand les émissions numpy c_final[:,i] et np.dot(a,b) ensemble, il produit un tableau avec une forme (2,2), qui ne peut donc pas être affecté à c_final[:,i] car il a une forme de (2,1). Je pense qu'il est beaucoup plus clair si vous jouez juste avec elle dans l'interpréteur:

>>> 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) 

La façon de contourner cela est d'aplatir np.dot(a,b) en utilisant np.squeeze ou quelque chose de similaire de sorte que quand ils sont diffusés ensemble, ils produisent un ensemble d'éléments 2 . Par exemple:

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

Vous n'êtes pas le seul à trouver le message d'erreur inutile. Quelqu'un a déposé un ticket à ce sujet il ya environ un an.

+0

Merci beaucoup! –